1,js中的new做了什么?
function Person () {
this.name = name;
this.age = age;
this.sex = sex this.sayName = function () {
return this.name;
};
} var person = new Person("tom", 21, "famle"); console.log(person.name);
使用关键字new创建新实例对象经过了以下几步:
- 创建一个新对象
- 将新对象的_proto_指向构造函数的prototype对象
- 将构造函数的作用域赋值给新对象 (也就是this指向新对象)
- 执行构造函数中的代码(为这个新对象添加属性)
- 返回新的对象
var Obj = {}; Obj._proto_ = Person.prototype(); Person.call(Obj);
2,JS原型对象
1. 对比其他语言的理解
原型对象,就是其它语言中的类中的静态属性和静态方法,总是是静态-static就对了.原理是: 内存中只有一份.
2. 从代码的层次上介绍原型对象.
function Person(name_, age_) {
this.name = name_;
this.age = age_;
this.location = "地球";
}
// 三个具体的对象
var zhangsan = new Person("zhangsan", 21);
var lilei = new Person("lilei", 21);
var hanmeimei = new Person("hanmeimei", 21);
// 他们的原型对象是
Person.prototype.location = "地球";
Person.prototype.killPerson = function() {
return "杀人";
};
3,原型链查找
当代码获取某个对象的属性时,首先会在对象实例本身内查找,如果查找不到,就会向上搜索其原型对象。因此在实例中改变原型对象中的属性值,并不会重写这个属性值,只是原型对象中的属性值被屏蔽了而已。
4,Javascript闭包
闭包就是能够读取其他函数内部变量的函数
作用:闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
5,js运行机制
所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。
(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
(2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
(3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
(4)主线程不断重复上面的第三步。
https://segmentfault.com/a/1190000015294769
6,js排序
冒泡,选择,快排
7,["1", "2", "3"].map(parseInt)输出结果是多少?(多次出现)
输出结果:[1, NAN, NAN]
原因:
parseInt('1', 0); // 1 (parseInt的处理方式,这个地方item没有以"0x"或者"0X"开始,8和10这个基数由实现环境来定,ES5规定使用10来作为基数,因此这个0相当于传递了10)
parseInt('2', 1); // NaN (因为parseInt的定义,超出了radix的界限)如果该参数小于 2 或者大于 36返回NaN
parseInt('3', 2); // NaN (虽然没有超出界限,但是二进制里面没有3,因此返回NaN)
8,use strict是什么?有什么意义?
1,use strict
是一种在JavaScript代码运行时自动实行更严格解析和错误处理的方法
好处:
1,防止忽略或静默失败的代码错误。会产生错误或抛出异常,因此尽早提醒你代码中的问题,使调试更加容易。
2,防止意外的全局变量。非严格模式下,不带关键字声明的变量,会自动创建该名称的全局变量.在严格模式下,这样做的话会抛出错误。
3,消除 this 强制。如果没有严格模式,引用null或未定义的值到 this 值会自动强制到全局变量。这可能会导致许多令人头痛的问题和让人恨不得拔自己头发的bug。在严格模式下,引用 null或未定义的 this 值会抛出错误。
4,不允许重复的属性名称或参数值。当检测到对象(例如,var object = {foo: "bar", foo: "baz"};)中重复命名的属性,或检测到函数中(例如,function foo(val1, val2, val1){})重复命名的参数时,严格模式会抛出错误,因此捕捉几乎可以肯定是代码中的bug可以避免浪费大量的跟踪时间。
5,使eval() 更安全。在严格模式和非严格模式下,eval() 的行为方式有所不同。最显而易见的是,在严格模式下,变量和声明在 eval() 语句内部的函数不会在包含范围内创建(它们会在非严格模式下的包含范围中被创建,这也是一个常见的问题源)。
6,在 delete使用无效时抛出错误。delete操作符(用于从对象中删除属性)不能用在对象不可配置的属性上。当试图删除一个不可配置的属性时,非严格代码将默默地失败,而严格模式将在这样的情况下抛出异常。
9,json是什么?
1,json一种轻量级的数据交互格式
2,JSON.parse()【从一个字符串中解析出json对象】
3,JSON.stringify()【从一个对象中解析出字符串】
10,js实现延迟加载的几种方法?
1,使用setTimeout延迟方法的加载时间
2,js外部引入的文件放到页面底部
3,defer 属性
4,async 属性
5,动态创建DOM方式
11,创建一个ajax?
<script type="text/javascript">
window.onload = function(){
//第一步:创建xhr对象
//xhr是一个对象;里面可以放很多东西,数据;
var xhr = null;
if(window.XMLHttpRequest){//标准浏览器
xhr = new XMLHttpRequest();//创建一个对象
}else{//早期的IE浏览器
xhr = new ActiveXObject('Microsoft.XMLHTTP');//参数是规定的;
}
console.log("状态q"+xhr.readyState);//
//第二步:准备发送请求-配置发送请求的一些行为
//open即打开链接,第一个参数是以什么方式;第二个是往哪儿发送请求,第三个可以不写,默认true,表示异步,false表示同步;;
xhr.open('get','03form.php',true);
console.log("状态w"+xhr.readyState);// //第三步:执行发送的动作
//send也可以写在前面,推荐写在后面;写null是兼容问题;
xhr.send(null);
console.log("状态e"+xhr.readyState);// //第四步:指定一些回调函数,也属于事件函数;不触发不执行,触发条件是xhr.readyState;z这个值有0-4,共5个状态,是由浏览器控制的;
xhr.onreadystatechange = function(){
if(xhr.readyState == 4){//4指服务器返回的数据可以使用;
if(xhr.status == 200){ //判断已经成功的获取了数据;200表示hTTP请求成功;404表示找不到页面;503表示服务器端有语法错误;
var data = xhr.responseText;//json,文本,主角;
// var data1 = xhr.responseXML;
}
}
// console.log("状态t"+xhr.readyState);//2表示已经发送完成; // console.log(1234);
} // console.log(456);
console.log("状态r"+xhr.readyState);// }
</script>
12,apply()与call()的作用和区别?
/*apply()方法*/
function.apply(thisObj[, argArray]) /*call()方法*/
function.call(thisObj[, arg1[, arg2[, [,...argN]]]]);
作用:可以用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由thisObj指定的新对象
区别:
apply:最多只能有两个参数——新this对象和一个数组argArray。如果给该方法传递多个参数,则把参数都写进这个数组里面,当然,即使只有一个参数,也要写进数组里。如果argArray不是一个有效的数组或arguments对象,那么将导致一个TypeError。如果没有提供argArray和thisObj任何一个参数,那么Global对象将被用作thisObj,并且无法被传递任何参数。
call:它可以接受多个参数,第一个参数与apply一样,后面则是一串参数列表。这个方法主要用在js对象各方法相互调用的时候,使当前this实例指针保持一致,或者在特殊情况下需要改变this指针。如果没有提供thisObj参数,那么 Global 对象被用作thisObj。
13,阻止冒泡的几种方法?
if (evt.stopPropagation) {
//W3C
evt.stopPropagation();
}
else {
//IE
evt.cancelBubble = true;
}
14,Array.of()和Array.from()区别?
1,Array.of
方法用于将一组值,转换为数组
2,Array.from
方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)
15,
let a = Array.of(7)
let b = Array.from({length: 7})
let c = Array(7)
console.log(a)
console.log(b)
console.log(c)
输出结果:?
16,生成0-99的数组方式(不使用for循环一类的)?
Array.from({length:100},(val,i)=>i);
17,判断字符类型方法?
typeof 2 输出 number
typeof null 输出 object
typeof {} 输出 object
typeof [] 输出 object
typeof (function(){}) 输出 function
typeof undefined 输出 undefined
typeof '222' 输出 string
typeof true 输出 boolean
精准判断:Object.prototype.toString.call
var gettype=Object.prototype.toString gettype.call('aaaa') 输出 [object String] gettype.call(2222) 输出 [object Number] gettype.call(true) 输出 [object Boolean] gettype.call(undefined) 输出 [object Undefined] gettype.call(null) 输出 [object Null] gettype.call({}) 输出 [object Object] gettype.call([]) 输出 [object Array]
gettype.call(function(){}) 输出 [object Function]
18,数组的方法?
19,js数据类型?
基本数据类型:
String
Number
Boolean
Undefined
Null
Symbol(暂时不管)
引用数据类型:
JavaScript中的引用数据类型有:
Array
Object
20,校验手机号js?
function isPoneAvailable(str) {
var myreg=/^[1][3,4,5,7,8,9][0-9]{9}$/;
if (!myreg.test(str)) {
return false;
alert("请填写正确的手机号码")
} else {
return true;
alert("手机号码填写正确")
}
}