一共包括下面七种数据类型面试
Undefined 类型表示未定义,它的类型只有一个值,就是undefined。通常使用void 0 来获取一个undefined的值。数组
Null 类型也只有一个值,就是 null,它的语义表示定义了可是为空值.而且null是Javascript的一个关键字。因此通常不会把变量赋值为undefined,这样能够保证全部值为undefined的变量,都是从未赋值的天然状态bash
Boolean有两个值true和false,表示逻辑意义上的真和假。函数
字符串的最大长度为2^53-1,Javascript中的字符串是永远没法变动的。一旦字符串建立出来没法用任何方式改变字符串的内容,因此字符串具备值类型的特征。ui
Javascript的Number类型基本符合双精度浮点数规则
。而且引入了几个特殊的状况:spa
Javascript的+0和-0的检测能够经过1/x 是Infinity或者-Infinity来进行区分。 根据浮点数的定义,非整数的Number类型没法用==来比较。prototype
经典的面试题: 在Javascript中,为何0.1+0.2!=0.3 ? (这个面试题错误的不是结论,而是比较的方法,这个题里面涉及到双精度浮点小数部分转化为2进制计算的过程当中舍掉精度而形成值不许致使,正确的比较方法以下:)code
// 绝对值小于最小精度
console.log( Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON);
复制代码
Symbol能够具备字符串类型的描述,即便描述相同,Symbol也不相等。cdn
var mySymbol = Symbol("my symbol");
复制代码
可使用Symbol.iterator来自定义for..of在对象上的行为。对象
var o = new Object
o[Symbol.iterator] = function() {
var v = 0
return {
next: function() {
return { value: v++, done: v > 10 }
}
}
};
for(var v of o)
console.log(v); // 0 1 2 3 ... 9
复制代码
当使用==的时候会进行类型转换。
每一种基本数据类型String、Number、Boolean、Symbol在对象中都有相对应的类。所谓装箱转换就是把基本数据类型转换为对应的对象。
Object.prototype.toString.call能够准确的识别对象对应的基本类型。可是须要注意的是call自己会产生装箱操做。因此须要配合typeof来区分基本数据类型仍是对象类型。
Javascript标准中规定了ToPrimitive函数,它是对象类型到基本数据类型的转换。而且对象内部有valueOf和toString方法。当对对象进行不一样的拆箱的时候调用顺序会有所不一样。(还须要注意一个点就是当对象做为数组arr的变量取值的时候arr[obj]是先调用obj的toString的
)
// valueOf 和 toString必须返回原始值 不然继续向下执行 最终抛出错误
var o = {
valueOf : () => {console.log("valueOf"); return {}},
toString : () => {console.log("toString"); return {}}
}
o * 2
// valueOf
// toString
// TypeError
// 先toString后valueOf
var o = {
valueOf : () => {console.log("valueOf"); return {}},
toString : () => {console.log("toString"); return {}}
}
String(o)
// toString
// valueOf
// TypeError
// Symbol.toPrimitive的优先级最高
var o = {
valueOf : () => {console.log("valueOf"); return {}},
toString : () => {console.log("toString"); return {}}
}
o[Symbol.toPrimitive] = () => {console.log("toPrimitive"); return "hello"}
console.log(o + "") // 若是没有Symbol.toPrimitive,其实这个也是先调valueOf 而后再是toString
// toPrimitive
// hello
复制代码
看下加法运算符的规范: