- JS的输出输入有哪些?
答案:JS的输出:
(1) alert(“提示内容”);弹出警告框
(2) document.write(“提示内容”) ; 向文档流中打印输出内容
(3) console.log(“提示内容”);向控制台输出日志信息
- 提示内容可以是字符串,数字或变量,表达式等等JS的输入:① prompt(提示信息,默认值)
用户点击确定按钮,得到输入的值,
用户点击取消按钮,得到Null② confirm (确认对话框)
可以用变量接收它的结果,用户点击确定返回true,用户点击取消返回false.③ 表单中的输入框
- 提示内容可以是字符串,数字或变量,表达式等等JS的输入:① prompt(提示信息,默认值)
JS的数据类型有哪些?答案:基本数据类型包括:Number - - (数字)String - - (字符串)Boolean - - (布尔值)Undefined - - (未定义)Null - - (空的)Symbol - - (符号)引用数据类型包括:1.Object - - (对象)以下都是属于Object之内的:① Array - - (数组)② Function - - (函数)③ Date - - (时间)④ RegExp - - (正则)⑤ …(还有很多
如何判断JS变量的数据类型? typeof()instanceofconstructortoStringObject.prototype.toString
typeof求解的可能值有哪些?
“number”“string”“boolean”“undefined”“object”“symbol”“function”
数据类型的自动转换和隐式转换你知道哪些?
隐式类型转换:1 == ‘1’‘1’ + 1‘1’ - 1显示类型转换:parseInt(str,radix)/parseFloat(str,radix)/Number()转变成数字。Boolean(param)转变成布尔值subString()转变成字符串
“ == ” 和 “ === ” 还有 “ != ” 和 “ !== ”的区别?
“ == ” 和 “ != ”会做数据隐式类型转换,转换完数据类型在做比较。而“ === ” 和 “ !== ”会先判断数据类型,如果俩者的数据类型不一致直接返回false就不会再去做值的比较了。
讲一讲“ || ” 和 “ && ”。
答案:”||”和”&&”分别是或逻辑运算符、与逻辑运算符,或逻辑运算符是当判断条件中存在true的情况就执行结果,而与逻辑运算符是当判断条件中不存在false的情况才执行结果。
“ i++ ” 和 “ ++i ”的区别。
答案:i++是先引用i的值而后将i递增1。++i是先将i的值加1而后引用它的值。
break,return,continue三者的区别
答案:一:return在函数体中遇到return语句,则结束函数执行(函数体未执行完部分不再执行),将表达式的值返回到函数调用处。使用return最多只能返回一个值!二:breakbreak主要用在循环语句或者switch语句中,用来退出整个语句块。break跳出最里层的循环,并且继续执行该循环下面的语句。break当用于循环结构时,表示退出其所在的整个循环结构,当前次循环未完成任务及未完成循环次数将不再执行!三:continuecontinue适用于任何循环控制结构中。作用是让程序立即跳转到下一次循环的迭代。在for循环中,continue语句使程序立即跳转到更新语句。在while或者do。。。while循环中,程序立即跳转到布尔表达式的判断语句。continue只能用于循环结构,表示结束当前次循环,还会判断条件进行下一次循环。
请讲一讲递归。
当一个函数解决一个任务时,在该过程中它可以调用很多其他函数。那么当 一个函数调用自身时 ,就称其为递归。
你一般如何调试bug?
答案:断点调试(逻辑异常时使用)(1) 在可能出错的位置设置断点(2) 启动调试(3) 单部执行(F10),观察变量的变化,将变量变化结果与预期结果进行比较,如果结果一致,则继续执行,如果不一致,可能出错。(4) 找出出错位置,修改
数组的常用API你知道哪些?
答案:(1) 向数组添加元素的方法:Array.push()、Array.unshift()、Array.splice()(2) 向数组删除元素的方法:pop()、shift()、splice()、reverse()、sort()(3) 数组连接的方法:concat()、join()(4) 数组截取的方法:slice()(5) 数组转换的方法:toString()、flat()
请讲将数组与伪数组的区别。
答案:数组是用来存储一系列值的一个集合,而每个值在数组里面都有一个对应的索引,也可以叫做下标,索引是从0开始的,依次递增。伪数组我们可以理解为类似数组的一个集合,我们常见的有两个,一个是arguments还有一个是DOM的children属性,获取回来的子节点集合。他们与数组一样,具有索引(下标)和length属性,可以通过for循环写循环语句取循环遍历。区别:伪数组与数组的区别就是它们的_proto_区别,普通数组有很多数组的方法比如push、shift等等,而伪数组却没有,所以我们称这类解构类似数组却没有数组方法的集合叫做伪数组。把伪数组变成真数组的方法:// 假设我们获取到了一个一个页面的所有div,这就是一个伪数组。const fakeArr = document.getElementsByTagName(‘div’);// 我们可以进行重新赋值也可以用一个新变量接收或者在上方就进行转换简写都可以,笔者拿个新变量接收他。// 如果你要重新赋值别忘了将const变成let。const realArr = Array.prototype.slice.call(fakeArr);
请讲讲你对面向对象编程的理解。
答案:OOP的全称:Object Oriented Programming概念:NamespaceClass:定义对象的特征,定义对象的模子,JS没有类的概念Object:实体Property:属性,对象的特征(静态)Method:方法,对象的特征(动作行为)Constructor:构造,对象初始化的瞬间, 被调用的方法面向对象三大特性:Encapsulation封装Inheritance继承Polymorphism多态Abstraction抽象:抽取对象面向对象编程就是基于对象编程,给不同的对象封装不同的方法与属性,通过调用对象的方法和属性实现代码的复用,而且不会全局污染。
请讲讲原型链。
答案:原型就是prototype属性,所有function定义的函数都拥有这个属性,prototype属性是一个指针,指向一个对象,可以添加属性和方法。方法过载的问题:为每一个对象实例都创建了一个单独的方法,占据了大量的内存空间。所以就采用原型来解决方法过载问题——可以让所有对象实例共享它所包含的属性和方法。//定义一个构造函数、类function Person(name,age){this.name=name;this.age=age;}//定义一个原型方法Person.prototype.run = function(){函数体};//实例化一个对象var person1 =new Person(“刘备”,89);var person2 =new Person(“关羽”,78);console.log(person1.run === person2.run );//true,关键点 下图是构造函数、原型对象以及实例之间的关系图,用来帮助理解 原型链是实现继承的一种方式,其基本思想就是利用原型让一个引用类型继承另一个引用类型的属性和方法。简单来说就是子类的原型对象等于父类的实例对象(继承),实现的本质是重写原型对象。下面举一例子来说明:function SuperType() { this.property = true;}SuperType.prototype.getSuperValue = function() {
return this.property;};function SubType() {
this.subproperty = false; //继承SuperTypeSubType.prototype = new SuperType();SubType.prototype.getSubValue = function() {
return this.subproperty;};var instance = new SubType();Alert(instance.getSuperValue()); //true 看下面一张图,用来解说原型链: 我们知道,所有引用类型默认都继承了Object,而这个继承也是通过原型链来实现的。大家要记住,所有函数的默认原型都是Object的实例,因此默认原型都会包含一个内部指针,指向Object.prototype.这也正是所有自定义类型都会继承toString()等默认方法的根本原因。原型链的问题:1、包含引用类型值的原型属性会被所有实例共享。2、在创建子类型的实例时,不能向超类型的构造函数中传递函数。3、无法实现继承多个。4、要想为子类新增属性和方法,必须要在new Animal()这样的语句之后执行,不能房东构造器中
请讲讲继承的方法。
答案:先定义一个父类://构造函数function Animal(name) { this.name = name || ‘Animal’; this.sleep = function() { console.log(this.name + ‘正在睡觉!’); };}//原型上面的方法:Animal.prototype.eat = function(food) { console.log(this.name + ‘正在吃:’ + food);}(1) 原型链继承//核心:将父类的实例作为子类的原型function Dog() { }Dog.prototype = new Animal(); //将Animal的实例挂载到了Dog的原型链上//或://Dog.prototype = Object.create(Animal.prototype)Dog.prototype.name = ‘dog’; var dog = new Dog();console.log(dog.name); //dogdog.eat(‘bone’); //dog正在吃:bonedog.sleep(); //dog正在睡觉!console.log(dog instanceof Animal); //trueconsole.log(dog instanceof Dog); //true特点: 1、非纯粹的继承关系,实例是子类的实例,也是父类的实例2、父类新增原型方法/原型属性,子类都能访问的到3、简单 缺点 1、要想为子类新增属性和方法,必须要在new Animal()这样的语句之后执行,不能放到构造器中2、无法实现继承多个3、来自原型对象的所有属性被所有实例共享4、创建子类实例时,无法向父类构造函数传参(2) 构造继承//核心:使用父类的构造函数增强子类实例,等于是复制父类的实例属性给子类(没用到原型)function Cat(name) { Animal.call(this); this.name = name || ‘Tom’;} var cat = new Cat();console.log(cat.name); //Tomcat.sleep(); //Tom正在睡觉!console.log(cat instanceof Animal); //falseconsole.log(cat instanceof Cat); //true特点:创建子类实例时,可以向父类传递参数可以实现多继承(call多个父类对象)缺点:实例并不是父类的实例,只是子类的实例只能继承父类的实例属性和方法,不能继承原型属性/方法无法实现函数复用,每个子类都有父类实例函数的副本,影响性能 (3) 组合继承//核心:通过调用父类构造,继承父类的属性并保留传参的优点,然后通过将父类实例作为子类原型,实现函数复用function Cat(name) { Animal.call(this); this.name = name || ‘Tom’;}Cat.prototype = new Animal();Cat.prototype.constructor = Cat; var cat = new Cat();console.log(cat.name); //Tomcat.sleep(); //Tom正在睡觉console.log(cat instanceof Animal); // trueconsole.log(cat instanceof Cat); // true特点:弥补了方式2的缺陷,可以继承实例属性/方法,也可以继承原型属性/方法既是子类的实例,也是父类的实例不存在引用属性共享问题函数可复用可传参缺点:调用了俩次构造函数,生成了俩份实例(子类实例将子类原型上的那份屏蔽了) (4) 寄生组合继承//核心:通过寄生方式,砍掉父类的实例属性,这样,在调用俩次父类的构造的时候,就不会初始化俩次实例方法/属性,避免了组合继承的缺点。function Cat(name) { Animal.call(this); this.name = name || ‘Tom’;}(function() { var Super = function() {}; //创建一个没有实例的方法类。 Super.prototype = Animal.prototype; Cat.prototype = new Super(); //将实例作为子类的原型。})(); let cat = new Cat();console.log(cat.name); //Tomcat.sleep(); //Tom正在睡觉console.log(cat instanceof Animal); // trueconsole.log(cat instanceof Cat); //true Cat.prototype.constructor = Cat; //修复构造函数特点:基本上是完美的缺点:实现起来较为复杂
请讲讲JavaScript作用域。
答案:JS的作用域一共有三个范围,分别是:(1) 全局作用域:定义在所有函数之外的变量,其作用范围是在整个脚本中(2) 局部作用域(函数作用域),使用var定义在函数内部的变量,其作用范围是整个函数结构,超出函数{}花括号的范围则不能使用(3) 块级作用域:ES6声明变量的方式:let/constIIFE(立即调用函数表达式—自动执行匿名函数)//这三种都属于IIFE写法 (function () {})(); (function () {}()); +function () {}(); //作用与ES6当中的let是一样的,只不过用这个语法是为了解决个别浏览器的兼容问题。
请讲讲变量的声明提升
答案:l 将使用var定义的变量声明提升到对应作用域的最顶部,赋值部分位置不变。l 使用ES6的let与const没有声明提升。l 函数的定义也存在声明提升:l 如果是声明的方式定义的函数,将整个函数(声明及函数主体)都提升到作用域的最顶部。l 如果是表达式的方式定义的函数,只提升声明,不提升赋值(函数主体部分)。//在声名函数前面输出它。输出的结果就是整个声名函数的内容console.log(testArg)function testArg(a, b, c){ console.log(arguments)}//在函数表达式之前输出函数console.log(testArg)var testArg = function(a, b, c) { console.log(arguments)}
创建对象的方法有哪些?
答案:对象就是属性的无序集合。数组是有序集合。1、直接量(也叫字面量) 属性(对象的静态体征) 方法(对象的动态行为) 一个属性属性名结束后用,逗号隔开。var stu = { //name与age属于静态体征 name: ‘李四’, age: 13, //study与eat属于动态行为 study: function(course) { console.log(‘学习课程:’ + course) }, eat: function(pig) { console.log(‘吃:’ + pig) }}2、通过构造函数创建 方法:var person = new 函数名();通过该方法创建对象时,会自动执行该构造函数。例如://构造函数的函数名首字母大写,区分与普通函数的区别,不是强制规定的,你也可以小写。function Person(name, sex) { this.name = name; this.sex = sex, this.job = function() { alert(this.name) }}var child = new Person(‘Jack’, ‘男’);Person.job();//此代码一共会两次跳出对话框,因为创建对象时会自动执行构造函数一次。this指的是调用函数的对象。 3、通过new Object()创建方法:通过object构造器new一个对象,在丰富对象信息。var person = new Object();person.name = ‘wuxiaodi’;person.sex = ‘boy’;4、工厂方式function createStudent(name, age) { let stu = new Object(); stu.name = name; stu.age = age; stu.study = function() { console.log(this.name + " 学习…"); } return stu;}
请讲讲ECMAScript的内置对象。
答案:Array、Math、Number、String、Date、JSON
Array在ES5新增遍历的API它们每个的用法,返回值,参数。
答案:1. forEach(callback)对数组的每个元素执行一次提供的参数。callback是一个函数,在遍历数组的每个元素时,都会去调用该函数执行callback函数结构function(currentValue, index, array) {- currentValue表示的是当前遍历到的数组元素值- index表示的是当前遍历到的数组元素下标- array表示的是当前调用forEach()方法的数组对象}使用方法:let newArray = [];array.forEach((item, index, arr) => { console.log(‘currentValue:’, item) console.log(‘index:’, index) console.log(‘arr:’, arr) newArray.push(item * 2)})console.log(newArray)2. map(callback)创建一个新数组,其结果是该数组中每个元素都调用一个提供的函数后返回的结果。
即map()方法调用后返回一个新数组,新数组中的元素是callback函数的返回值。
使用方法:let newArray = array.map((item, index) => {console.log(‘currentValue:’, item) console.log(‘index:’, index) return item * 2})console.log(newArray)3. some(callback)测试数组中的某些元素是否通过由提供的函数实现的测试测试,返回boolean值,每个元素都会调用执行callback函数,当callback函数返回为false时,继续遍历下一个元素,直到遍历结束,最终返回false。如果在遍历到某个元素时,callback返回true则结束遍历,some()返回true的结果。使用方法:let mark = array.some((item, index) => {console.log(‘currentValue:’, item) console.log(‘index:’, index) return (item < 0)})console.log(mark)4. every(callback)测试数组中的每一个元素是否通过由提供的函数实现的测试必须全部符合条件才会返回true,否则返回false。
测试代码如下:let mark = array.every((item, index) => { console.log(‘currentValue:’, item) console.log(‘index:’, index) return (item < 2)})console.log(mark)5. filter(callback)过滤,筛选出callback函数返回值为true的对应元素,放到新的数组中。
测试代码如下:let newArray = array.filter((item, index) => { console.log(‘currentValue:’, item) console.log(‘index:’, index) return (item < 6)})console.log(newArray)
ES5/ES6新增的哪些东西是你平时开发中常用到的?
答案:ES5新特性(1) 数组尾逗号 [,].length [1, 2, 3,].length //支持ES5的则length为3 //不支持ES5的length为4(2) 严格模式 use strict; //注意:必须作为其作用范围内的第一条语句 l 变量必须先声名后赋值l 不允许直接使用以0开头的八进制表示,如果要表示八进制数字,以 0o 为前缀l 如果直接使用函数名调用函数,则函数体中的this为undefined。(3) This以及更改this指向(这个知识点可扩展开来)ES6新特性:(1) 模板字符串:拼接字符串与变量,可换行let name = ‘wuxiaodi’; let res = hello ${name} !
;(2) 块级作用域:let/const(没有声明提升,在变量定义前使用,会报错)(3) 箭头函数 ()=>{} 箭头函数不会绑定自己的this,箭头函数中的this会继承当前上下文的this关键字。箭头函数不能作为构造函数使用(4) 解构赋值(5) 展开运算符 …三个点(6) Promises Promise用于优雅地处理异步请求(展开来学习,未学懂)(7) 模块的Import和Export import用于引入模块,export用于导出模块(8) 新增Map集合 主要用于存储key-value键值对 var m = new Map([[‘Michael’, 95], [‘Bob’, 75], [‘Tracy’, 85]]); m.get(‘Michael’); // 95(9) 新增Set集合 存储任何类型的唯一值,即集合中所保存的元素是不重复的。 var s = new Set([1, 2, 3, 3, ‘3’]); s; // Set {1, 2, 3, “3”}
列举浏览器对象模型BOM里常用的至少四个对象,并列举window对象的常用方法至少五个。
答案:BOM全称Browser Object Model(浏览器对象模型)作用:使JavaScript有能力与浏览器“对话”。1、Window对象:代表浏览器打开的窗口,使一个全局对象,可以使用window来应用该对象。对象常用方法:① alert()② Confirm()③ Prompt()④ Open()⑤ Close()2、Location对象 3、History对象 代表访问历史记录4、Navigator对象 代表浏览器自身5、Document对象 — DOM 代表浏览器中打开的文档
请讲一下你知道的性能优化的方法。
答案:提高JS性能的12个技巧
事件绑定和普通事件有什么区别?答案:(1) 事件绑定就是addEventListener,能添加多个事件绑定,按顺序执行,而普通事件就是onclick添加事件,不能绑定多个事件,后面绑定的会覆盖前面的。(2) AddEventListener方式,不支持低版本的IE。(IE9以上才支持,而低版本的支持attachEvent)(3) 普通方式绑定事件后,不可以取消。addEventListener绑定后则可以用removeEventListener去取消。(4) addEventListener使W3C DOM规范中提供的注册事件监听器的方法。这里我补充事件捕获和事件冒泡的知识点:JS的事件流(事件处理的流程):1、事件捕获 2、处理目标 3、事件冒泡事件捕获:在DOM树中,沿着DOM树结构,从顶层向底层传播事件的行为。事件冒泡:在DOM树中,沿着DOM树结构,从底层向顶层传播事件的行为。27. IE和其他浏览器事件流的区别。答案:IE浏览器是事件冒泡,其他浏览器是事件捕获(标准DOM事件流)。
IE的标准下有哪些兼容性的写法?
答案:javascript之IE兼容篇
请讲一下this的指向问题。
答案:关于this的指向问题,可以这样去描述:谁调用就指向谁!1、通常在函数中的this指向的是调用函数的哪个对象(谁调用就指向谁)function test () { console.log(this.x) //指向obj,输出2}var obj = {};obj.x = 2;obj.m = test;obj.m(); 2、事件函数中的this通常指向的是绑定事件的事件源元素3、构造函数中的this(使用new调用构造函数创建对象),通常指向的是new所创建出来的对象本身var x = 4; //定义全局变量,为了用来测试function Test () { this.x = 11; //this指向newObj}var newObj = new Test();console.log(newObj.x) //输出11console.log(x) //输出结果为4,表明全局变量没有被this.x影响4、全局范围的this通常指向的是全局对象(浏览器中是window)var x = 1;function test() { console.log(this.x) //指向window,输出1}test() //这个其实是window.test()的简写
更改this指向的方法有哪些?
答案:更改this指向的方法有:call()、apply()、bind()1、call()window.color = ‘red’;document.color = ‘yellow’;var s1 = {color: ‘blue’};function changeColor () { console.log(this.color);}changeColor.call() //不传参数默认指向window 输出:redchangeColor.call(window) //指向window 输出:redchangeColor.call(document) //指向document 输出:yellowchangeColor.call(this) //构造函数的this如果打括号调用默认指向window 输出:redchangeColor.call(s1) //指向s1对象 输出:blue2、apply()window.number = ‘one’;document.number = ‘two’;var s1 = {number: ‘three’}; function changeNum() { console.log(this.number)}changeNum.apply(); //onechangeNum.apply(window); //onechangeNum.apply(document);//twochangeNum.apply(this);//onechangeNum.apply(s1);//threeapply和call的相同点:都是为了一个本不属于一个对象的方法,让这个对象去执行。apply和call的区别:接收的参数不同apply()方法接收两个参数,一个是函数运行的作用域(this),另一个是参数数组。call()方法第一个参数和apply()方法的一样,但是传递给函数的参数必须一一列举出来。语法:
apply([thisObj [,argArray]]);
调用一个对象的一个方法,另一个对象替换当前对象
call([thisObj [,arg1[,arg2[…,argn]]]]);说明:如果thisObj是null或者undefined的时候,默认指向window。如果argArray不是一个有效数组或不是arguments对象,那么将导致一个TypeError,如果没有提供argArray和thisObj任何一个参数,那么Global对象将用作thisObj。Call方法可以用来代替另一个对象的一个方法,call方法可以将一个函数的对象的上下文从初始的上下文改变为thisObj指定的新对象,如果没有提供thisObj参数,那么Global对象被用于thisObj。3、bind()var obj = { name: ‘WuXiaoDi’}function printName() { console.log(this.name)}var wuXiaoDi = printName.bind(obj)console.log(wuXiaoDi) //function(){…}wuXiaoDi() //WuXiaoDi小总结:Function.prototype.bind(thisArg) - - ES5能够返回一个新函数,该新函数的主体与原函数主体一致,但当新函数被调用执行时,函数体中的this指向的是thisArg所表示的对象。Function.prototype.call(this.Arg,val1,val2, …)调用函数执行,在函数执行时将函数体中的this指向修改为thisArg所表示的对象val1, val2, … 表示传递给调用函数的实际参数列表Function.prototype.apply(thisArg, array|arguments)调用函数执行,在函数执行时将函数体中的this指向修改为thisArg所表示的对象,array|arguments 表示调用函数的参数列表,使用数组或类数组的格式
请讲一下bind(),call(),apply()三者的区别。
答案链接同上
请讲一下JavaScript的闭包。有什么特点?对页面有什么影响?
答案:闭包就是指有权访问另一个函数作用域中的变量的函数。闭包由两部分构成:函数,以及创建该函数的环境。环境由闭包创建时在作用域中的任何局部变量组成。(以上两点都是官方的概念难以理解)但是理解闭包的关键在于:外部函数被调用之后其变量对象本应该被销毁,但闭包的存在使我们仍然可以访问外部函数的变量对象,这就是闭包的重要概念。 闭包的注意事项(特点):在创建一个闭包以后,这个函数的作用域会一直保存到闭包不存在为止。 闭包只能取得包含函数中的任何变量的最后一个值闭包中的this对象:在全局作用域中调用匿名函数,this指向window 你影响:闭包的缺点就是常驻内存会增大内存使用量,并且使用不当很容易造成内存泄露。d33. 事件委派/事件委托是什么?答案:事件委托/事件委派还有一个名字:事件代理。事件委派就是利用事件冒泡,将后代元素上事件的处理程序委派给祖先元素。event.target || event.srcElement - 在事件传播的过程中,获取最初触发事件的事件源元素。例子:当div标签内有上万个h5标签,我们想要点击每个h5标签时,弹出对应的innerHTML。常规的做法就是遍历每个h5,然后在每个h5上绑定一个点击事件,但是遍历上万个标签这样会导致性能降低。这时候就要用上事件委托了。obj1.addEventListener(‘click’,function(e){ var e=e||window.event; if(e.target.nodeName.toLowerCase()==‘h5’){ alert(e.target.innerHTML); } },false);由于事件冒泡机制,h5会冒泡到div,触发div所绑定的事件,进而追踪到事件源,就可以达到预期的效果。
如何阻止事件冒泡和浏览器默认事件?
答案:阻止事件冒泡的方法(阻止事件捕获也是用这个方法);当事件冒泡带来副作用时,需要阻止冒泡//标准://阻止事件传播行为event.stopPropagation();//非标准:event.cancelBubble = true;//兼容写法:event.stopPropagation ? event.stopPropagation() : event.cancelBubble = true; 浏览器默认事件行为:(1) 浏览器中点击右键弹出快捷菜单(2) 点击超级链接跳转到刷新页面(3) 表单中点击提交按钮能够提交表单阻止浏览器默认行为的方法://标准event.preventDefault();//非标准event.returnValue = false;//兼容写法:event.preventDefault ? event.preventDefault() : event.returnValue = false; JS事件流介绍与阻止事件冒泡
添加,删除,替换,插入到某个节点的方法。
DOM知识详细整理
document.load和jquery.ready的区别。
答案:Document.onload:在结构和样式加载完才执行js(就是在html和css都完事以后才执行)Window.onload:不仅仅要在结构和样式加载完,还要执行完所有的样式、图片这些资源文件,全部加载完才会触发window.onload事件。Jquery.ready:指定在DOM完全加载时要执行的函数。
请讲一下JavaScript的同源策略。
答案:一段脚本只能读取来自同一来源的窗口和文档的属性,这里的同一来源指的是主机名、协议和端口号的组合。(这里的跨域问题有待学习)
请说出你知道的跨域的方法有哪些?最常用的是哪个?怎么使用的?
答案:前端跨域的六种解决方法
JavaScript是一门什么样的语言?它有哪些特点?
答案:javaScript是一种轻量级直译式脚本型语言,是一种动态类型、弱类型、基于原型的语言,它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言。
Javascript的特点:
1、简单性:它的变量类型是采用弱类型,并未使用严格的数据类型。
2、动态性: 它可以直接对用户或客户输入做出响应,无须经过Web服务程序
3、跨平台性:JavaScript是依赖于浏览器本身,与操作环境无关。
4、安全性:只能通过浏览器实现信息浏览或动态交互。从而有效地防止数据的丢失。
正则表达式构造函数var reg = new RegExp(‘xxx’)与正则表达式字面量var reg = /xxx/有什么不同?
答案:当使用RegExp()构造函数的时候,不仅需要转义引号(即 \’ 表示 ’ ),并且还需要双反斜杠才能表示一个反斜杠。所以我们使用正则表达式字面量的效率更高。//正则表达字面量var re = /\/gm; //正则构造函数var reg = new RegExp("\\",“gm”); var foo = “abc\123”; //foo的值为"abc\123" console.log(re.test(foo)); //trueconsole.log(reg.test(foo)); //true
JavaScript中callee和caller的作用?
答案:JavaScript中callee和caller的区别
简述JavaScript的DOM里document获取节点的方法,并说出对应作用。答案:DOM知识详细整理
简述创建函数的几种方式。
答案:1、声明函数function 函数名 (参数列表) { //函数主体:可被重复使用的代码块。}2、函数表达式var 变量名 = function (参数列表) { //函数主体:可被重复使用的代码块。}
把script标签放在body结束标签之前和结束标签之后有什么区别?浏览器会怎么解析它们?
答案:如果说放在body的封闭之前,将会阻塞其他资源的加载。如果放在body封闭标签之后,不会影响到body内元素的加载。html代码是从上往下依次执行,