1、原始类型有哪几种?null 是对象嘛?
__proto__
Boolean String Number Undefined Null Symbol(ES6新增) ES10新增了一种基本数据类型:BigInt。
复杂数据类型只有一种: Object
null为空对象
2、对象类型和原始类型的不同之处?函数参数是对象会发生什么问题?
简单类型存放栈中,引用类型存放堆中,栈中变量存放引用地址
函数传参都是按值传递(栈中的存储的内容):基本数据类型,拷贝的是值;复杂数据类型,拷贝的是引用地址
内存的分配不同、访问机制不同、复制变量时不同(a=b)
3、typeof 是否能正确判断类型?instanceof 能正确判断对象的原理是什么?
typeof ⼀一元运算,后接任意类型 返 回"number"、"string"、"boolean"、"object"、"function" 和"undefined”。
用来检测一个对象是否已经定义或者是否已经赋值。判断原始类型可以 复杂类型不不准确,⽐如null ‘object’。instanceof来检测某个对象是不不是另⼀一个对象的实例例,object instanceofconstructor
但是拿来判断复杂类型也不不准确,
如 :var a=new Array();
alert(a instanceof Array); // true,
同时 alert(a instanceof Object) //也会返回 true;
这是因为 Array 是 object 的⼦子类。
加上对象的prototype会改变 所以instanceof也会变化。 要准确判断复杂类型的具体哪种内置类型,得⽤Object.prototype.toString
var a = new Date()
Object.prototype.toString.call(a)//"[object Date]"
4、如何进行类型转化,a) 对象转原始类型; b) 原始类型转对象;c)原始类型如何相互转换
参考链接:https://learnku.com/articles/7394/conversion-of-objects-to-basic-type-values-in-javascript
ToPrimitive(转换为原始值)
/**
* @obj 需要转换的对象
* @type 期望转换为的原始数据类型,可选
*/
ToPrimitive(obj,type)
Type为如下:
string: toString=> valueOf=>TypeError
Number: valueOf=> toString=>TypeError
空值:1.该对象为Date,则type被设置为String。2.否则,type被设置为Number
以下是es6引入symbol后,自定义对象转换基础类型的方法
toNumber Number()
toString
valueOf
ToObject=>原始类型变成对应内置对象,引用类型不变=>对象的 valueOf
5、==与===到底有什么差异,工作原理是什么;
"==="叫做严格运算符,"=="叫做相等运算符。
字符串比较按照字典顺序比较各个字符的unicode码点。
'cat' > 'Cat' // true'
'大' > '小' // false
原始类型的值之间,除了相等运算符(==)和严格相等运算符(===),其他比较运算符都是先转成数值再比较。
这里有一个特殊情况,即任何值(包括NaN本身)与NaN比较,返回的都是false.
对象是先转换成原始类型,valueOf()后还是对象再调用toString()。Date对象是先调用toString()后调用valueOf()
var x = [2];
x > '11' // true
// 等同于 [2].valueOf().toString() > '11'
// 即 '2' > '11'
严格相等运算符===:值和类型都相等
1 === 0x1 // true
+0 === -0 // true
复合类型===比较的是指针是否指向同一个地址,大小运算符比较的是值。
null===null //true
undefined===undefined //true
NaN===NaN //false
相等运算符:先将数据进行类型转换,然后再用严格相等运算符比较。
原始类型:原始类型的数据会转换成数值类型再进行比较.
'1' == true // true
// 等同于 Number('1') === Number(true)
// 等同于 1 === 1
对象(这里指广义的对象,包括数组和函数)与原始类型的值比较时,对象转化成原始类型的值,再进行比较.
[1] == '1' // true // 等同于 Number([1]) == Number('1')
undefined和null与其他类型的值比较时,结果都为false,它们互相比较时结果为true。只有在对象转为原始值得到undefined时,才会返回true
6、为什么 0.1 + 0.2 != 0.3?如何解决这个问题?
参考链接:https://juejin.im/post/5b20cbb051882513ac20354f#heading-1
0.1 + 0.2 === 0.30000000000000004
Js是双精度存储占⽤用 64 bit,浮点数在转换为⼆二进制表示的时候,无法精 确表示这 种包含小数点的数据,在Math.pow(2, 53)之前精度不不会丢失 , 一般将⼩数变成整数再进⾏比较
7、new 的原理是什么?通过 new 的方式创建对象和通过字面量创建有什么区别?
New 的过程:
1.创建空对象; var obj = {};
2. 完成原型链的构建
将所创建对象的__proto__属性值设为构造函数的prototype的属性值,, 即 指向 构造函数的原型对象
设置新对象的constructor属性为构造函数的名称,设置新对象的 __proto__ 属性 指向构造函数的prototype对象;
obj.__proto__ = Person.prototype;
3.执⾏行行构造函数中的代码,构造函数中 的this指向new出对象
4.返回对象,并赋给等号左边的变量量,如果函数没有返回其他对象,那么
new表达式中的函数调⽤用会⾃自动返回这个新对象。 字⾯面量量创建对象,不 不会调⽤用 Object构造函数, 简洁且性能更更好;
new Object() ⽅方式创建对象本质上是⽅方法调⽤用,涉及到在proto链中遍历 该⽅方法,当 找到该⽅方法后,⼜又会⽣生产⽅方法调⽤用必须的 堆栈信息, ⽅方法调⽤用结束后,还要释放该 堆栈,性能不不如字⾯面量量的⽅方式。 通 过对象字⾯面量量定义对象时,不不会调⽤用Object构造函数。
js中的内置对象:String、Number、Boolean、Object、Function、Array、Date、Error、RegExp
8、布尔值如何转化?转换原理是什么
Js中预期为布尔值的地方,自动调用Boolean函数,
以下为false ,其他为true:undefined、null、+0或-0、NaN、''(空字符串)
9、null和undefined的异同?
null是一个表示"无"的对象,"没有对象",即该处不应该有值,转为数值时为0;一般前端设置变量为null取消指向有值的对象,以释放内存。
undefined是一个表示"无"的原始值,"缺少值",就是此处应该有一个值,但是还没有定义,转为数值时为NaN
10、如何深入理解js对象
因此,情况是这样的,ECMAScript 规范说 prototype 应当是一个隐式引用:
1)通过 Object.getPrototypeOf(obj) 间接访问指定对象的 prototype 对象。
2)通过 Object.setPrototypeOf(obj, anotherObj) 间接设置指定对象的 prototype 对象。
3)部分浏览器提前开了 __proto__ 的口子,使得可以通过 obj.__proto__ 直接访问原型,通过 obj.__proto__ = anotherObj 直接设置原型。
4)ECMAScript 2015 规范只好向事实低头,将 __proto__ 属性纳入了规范的一部分。
访问对象的 obj.__proto__ 属性,默认走的是 Object.prototype 对象上 __proto__ 属性的 get/set 方法。