面试1
1.为什么 typeof null = 'object'
valueOf是把对象转换成一个基本数据的值
1 var frame = window.frames[0]; 2 var isInstanceOf = [] instanceof frame.Array; 3 console.log("frame.Array", frame.Array); 4 console.log("isInstanceOf", isInstanceOf) false
判断 类型
1. 使用 typeof 缺点:判断不出 Array 和 Object
2. 使用 instanceof.
3. 使用 Object.prototype.toString.call(this, ...) 返回 [object, Object]
为什么会返回这个? 可以自定义
1 class MyArray { 2 get [Symbol.toStringTag](){ 3 return "MyArray" 4 } 5 } 6 7 var pf = console.log; 8 var a = new MyArray(); 9 Object.prototype.toString.call(a)。返回 [object, MyArray]
Number.isNaN 和 isNaN 的区别
1. isNaN 会尝试转化为 数字,成功则 true,否则 false
2. Number.isNaN 直接判断
isNaN('aaa') // 会尝试将其转化为 数字。 true
Number.isNaN('aaa') // 不会转化 false
Number.isNaN = function (val) { return typeof val === "number" && isNaN(val); };
千分位
function format_with_regex(number) { var reg = /\d{1,3}(?=(\d{3})+$)/g; return (number + '').replace(reg, '$&,'); }
Symbol.toPrimitive 的使用
let obj = { [Symbol.toPrimitive](hint) { switch (hint) { case 'number': return 123; case 'string': return 'str'; case 'default': return 'default'; default: throw new Error(); } }, }; 2 * obj; // 246 3 + obj; // '3default' obj == 'default'; // true String(obj); // 'str'
[].valueof() 得到 []
[].toString(). 得到 ‘’
[2] + 2 得到 ‘22’
[] + { } = '[object Object]'. /. {} + [] = 0 / { } + { } = NaN. / [] + [] = ''
[][Symbol.ToPrimitive] = undefined。 { } 也是一样
.valueof() {}. /. .toString(). '[object Object]'
对象输出的顺序:
let obj = { 1: 'a', 2: 'b', 6: 'c', a: 'd', f: 'f' }
类
class Person { constructor(name, age){ this.name = name this.age = age } getName = ()=> { return this.name } getAge(){ return this.age } }
getName 是在创建 对象里面,而 getAge在原型对象上
const obj = {. }
Object.defineProperty(obj, 'name', {. }) 默认得到的都是 false
Object.preventExtensions( obj ) 不能添加新属性,但是可以删除
Object.isExtensible(obj1) 是否可以扩展属性
Object.seal( obj ) 不能删除/增加属性,只能修改本属性。 和下面一样只对 第一层有效
Object.freeze( obj ) 同上,也不能修改本属性
Object.isFrozen( obj ) 判断是 freeze 对象
Object.prototype.toString.call(Boolean.prototype). ==>. [object, Boolean]
Object.create(Prototype) 创建一个对象,并且 obj.__proto__ = Prototype
Object.setPropertyOf(obj, Prototype). obj.__proto__ = Prototype
私有属性。#canBack = 123
手写 instanceof function instanceOf(instance, cclass) { let proto = instance.__proto__; let prototype = cclass.prototype; while (proto) { if (proto === prototype) return true; proto = proto.__proto__; } return false; }
对象不能 使用 for. of 遍历。obj[Symbol.iterator]