1.JavaScript的本地对象,内置对象和宿主对象?
1.本地对象
ECMA-262 把本地对象(native object)定义为“独立于宿主环境的 ECMAScript 实现提供的对象”。
包含内容:Object、Function、Array、String、Boolean、Number、Date、RegExp、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError。
本地对象就是 ECMA-262 定义的类(引用类型)。
2.内置对象
ECMA-262 把内置对象(built-in object)定义为“由 ECMAScript 实现提供的、独立于宿主环境的所有对象,在 ECMAScript 程序开始执行时出现”。而ECMA-262 只定义了两个内置对象,即 Global 和 Math (它们也是本地对象,根据定义,每个内置对象都是本地对象)。
Global(全局对象):
isNaN()、parseInt()、parseFloat()、eval()方法等。
Math:
Math.PI
Math.random() 随机数
Math.random() 区域+起始值// 30-100整数console.log(Math.floor(Math.random()*71)+30)
Math.round() 四舍五入
Math.ceil() 进一法
Math.floor() 去尾法
Math.max() 最大值
Math.min() 最小值
Math.sqrt() 平方
Math.pow() m的n次方
Math.sin() 对比斜,括号里面只能输入弧度
Math.cos() 邻比斜
Math.tan() 对比邻
nub.toFixed(保留小位点后的数几位)保留的位数之后的四舍五入
3.宿主对象
由ECMAScript实现的宿主环境提供的对象,可以理解为:浏览器提供的对象。所有的BOM和DOM都是宿主对象。
2.从数组[1,'a', 'd',12,56]删除1,'a'?
let arr=[1,'a', 'd',12,56];
arr.splice(0,2);
console.log(arr);//["d", 12, 56]
console.log(0.1+0.2);
console.log('3'+4);
console.log('3'+'1');
console.log('5'-1);
console.log('3'+1);
console.log([]+{});
console.log([]==null);
console.log({} =={});
输出什么?原因?
console.log(0.1+0.2);
- 0.30000000000000004
- 浮点数值
console.log('3'+4);
- '34'
- 隐式转换string,toString()
console.log('3'+'1');
- '31'
console.log('5'-1);
- 4
- 隐式转换number,valueOf()
console.log('3'+1);
- 31
- 当加号运算符时,String和其他类型时,其他类型都会转为 String;其他情况,都转化为Number类型 , 注: undefined 转化为Number是 为’NaN‘, 任何Number与NaN相加都为NaN。其他运算符时, 基本类型都转换为 Number,String类型的带有字符的比如: '1a' ,'a1' 转化为 NaN 与undefined 一样。
console.log([]+{});
- "[object object]"
- ({}).toString() -> "[object Object]"
([]).toString() -> ""
"[object Object]"+ "" -> "[object object]"
console.log([]==null)
- false
- [] -> '' ''!==null ''!==undefined
console.log({} =={});
- false
- 对象存在堆区,在栈区存着两个对象的不同的指针,两个指针不同
4.垃圾回收机制,管理内存,如何优化?
答案参考我另一篇文章
5.比较typeof和instanceof区别?
1.typeof能够检测出了null之外的基础类型(String、Number、Boolean、Undefined)。
对于引用类型能判断出function、其他的都为Object。
2.instanceof是用来判断 A 是否为 B 的实例。
表达式为:A instanceof B,如果 A 是 B 的实例,则返回 true,否则返回 false。
在这里需要特别注意的是:instanceof 检测的是原型。
instanceof 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型。之后增加了Array.isArray()方法判断这个值是不是数组的。
如[1,2] instanceof Array
function fun(n,o) {
console.log(o)
return {
fun:function(m){
return fun(m,n);
}
};
}
var a = fun(0); a.fun(1); a.fun(2); a.fun(3);//undefined,?,?,?
var b = fun(0).fun(1).fun(2).fun(3);//undefined,?,?,?
var c = fun(0).fun(1); c.fun(2); c.fun(3);//undefined,?,?,?
//问:三行a,b,c的输出分别是什么?
6,7,8题的具体答案点击分析查看文章
a: undefined,0,0,0
b: undefined,0,1,2
c: undefined,0,1,1
var o={
fn:function (){
console.log(fn);
}
};
o.fn();
ERROR报错
8.var fn=function (){
console.log(fn);
};
fn();
function (){console.log(fn);};正确
使用var或是非对象内部的函数表达式内,可以访问到存放当前函数的变量;在对象内部的不能访问到。
因为函数作用域链的问题,采用var的是在外部创建了一个fn变量,函数内部当然可以在内部寻找不到fn后向上册作用域查找fn;
而在创建对象内部时,因为没有在函数作用域内创建fn,所以无法访问。
网友评论