JS基本数据类型
- 1. JS的基本数据类型有哪些?
- 2. JS有几种类型的值?是如何存储的?
- 3. null和undefined区别
- 4. 如何获取安全的 undefined 值?
- 5. 因为undefined访问对象属性时报错如何处理?
- 6. undefined 和 undeclared 的区别?
- 7. typeof
- 8. instanceof
- 9. Object.prototype.toString.call
- 10. in判断属性是否在对象中 TODO
- 11. typeof NaN 的结果是什么?
- 12. isNaN()和Number.isNaN函数的区别?
- 13. JS的内部属性[[Class]]是什么?
- 14. JS整数的安全范围有哪些?
- 15. 介绍JS有哪些内置对象?
# 1. JS的基本数据类型有哪些?
查看答案
js一共有6种基本数据类型,分别是 Undefined、Null、Boolean、Number、String,还有在ES6新增的 Symbol 类型,代表创建后独一无二不可变的数据类型。
# 2. JS有几种类型的值?是如何存储的?
查看答案
js有原始数据类型和引用数据类型两种。
原始数据类型有:Undefined、Null、Boolean、Number、String,还有在ES6新增的 Symbol 类型。
引用数据类型有:对象、数组和函数。
两种类型的区别是:存储的位置不同,原始数据类型直接存储在栈中的简单数据段,占据空间小,大小固定,属于被频繁使用的数据。
引用数据类型存储在堆中,占据空间大、大小不固定。
如果存储在堆中,将会影响程序运行的性能,引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。让解释器寻找引用值时,会首先检索其在栈中的地址,去的地址后从堆中获得实体。
# 3. null和undefined区别
查看答案
Undefined 和 Null 都是基本数据类型,这两个基本数据类型分别都只有一个值,就是 undefined 和 null。
区别:
- undefined 代表的含义是未定义,null 代表的含义是空对象。
- 一般变量声明了但还没有定义的时候会返回 undefined,null主要用于赋值给一些可能会返回对象的变量,作为初始化。
- 当使用双等号对两种类型的值进行比较时会返回 true,使用三个等号时会返回 false。
null == undefined // true
null === undefined // false
- 当对这两种类型使用 typeof 进行判断时,Null 类型化会返回 “object”,Undefined会返回 “undefined”。
typeof undefined // undefined
typeof null // object
- undefined 在 JavaScript 中不是一个保留字,这意味着可以使用 undefined 来作为一个变量名,但是这样的做法是非常危险的,它会影响对 undefined 值的判断。null是关键字,但是不能将其作为标识符,不能用作变量名。
var undefined = 123
console.log(undefined); // 123
# 4. 如何获取安全的 undefined 值?
查看答案
因为 undefined 是一个标识符,所以可以被当作变量来使用和赋值,但是这样会影响 undefined 的正常判断。表达式 void ___ 没有返回值,因此返回结果是 undefined。void 并不改变表达式的结果,只是让表达式不返回值。
因此可以用 void 0 来获得 undefined。
# 5. 因为undefined访问对象属性时报错如何处理?
查看答案
- && 短路运算符
- || 设置保底默认值
- try-catch方法
- lodash get方法
- ?. 可选链操作符
# 6. undefined 和 undeclared 的区别?
查看答案
undefined:已经在作用域中声明但是还没有赋值的变量。
undeclared:还没有在作用域中声明过的变量。
对于undeclared变量的引用,浏览器会报引用错误,如 “ReferenceError: b is not defined.”
但是我们可以用typeof 的安全防范机制来避免报错,因为对于undeclared(或者 not defined)变量,typeof 会返回 undefined。
typeof abc // 'undefined'
# 7. typeof
查看答案
只判断基础类型(除null以外),引用类型只有function、object
特殊:
typeof null => 'object'
typeof NaN => 'number'
typeof array => 'object'
2
3
# 8. instanceof
查看答案
- instanceof 的内部机制是通过判断对象的原型链中是不是能找到类型的 prototype。
- a instanceof b,是判断a是否可以在b的原型链中找到。
- 不可以用来判断基本数据类型,会直接返回false
- 所有对象类型 instanceof Object 都是 true。
[] instanceof Array; // true
[] instanceof Object; // true
2
# 9. Object.prototype.toString.call
查看答案
这是判断数据类型的万能方法
- 每一个继承 Object 的对象都有 toString 方法,如果 toString 方法没有重写的话,会返回 [Object type],其中 type 为对象的类型。
- 但当除了 Object 类型的 对象外,其他类型直接使用 toString 方法时,会直接返回都是内容的字符串, 所以我们需要使用 call 或者 apply 方法来改变 toString 方法的执行上下文。
- 这种方法对于所有基本的数据类型都能进行判断,即使是 null 和 undefined 。
- Object.prototype.toString.call() 常用于判断浏览器内置对象。
Object.prototype.toString.call('An') // "[object String]"
Object.prototype.toString.call(1) // "[object Number]"
Object.prototype.toString.call(true) // '[object Boolean]'
Object.prototype.toString.call(Symbol(1)) // "[object Symbol]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call([1,2,3]) // '[object Array]'
Object.prototype.toString.call(function(){}) // "[object Function]"
Object.prototype.toString.call({name: 'An'}) // "[object Object]"
2
3
4
5
6
7
8
9
一般用的时候也会把多余的内容去掉
Object.prototype.toString.call('An').slice(8, -1) => 'String'
# 10. in判断属性是否在对象中 TODO
# 11. typeof NaN 的结果是什么?
查看答案
NaN 意指 “不是一个数字”(not a number),NaN是一个警戒值(有特殊用途的常规值),用于指出数字类型中的错误情况,即“执行数学运算没有成功,这是失败后返回的结果”。
typeof NaN // “number”
NaN和自身不相等,是唯一一个非自反(自反,reflexive,即 x === x 不成立)的值。
NaN !== NaN // true
NaN === NaN // false
# 12. isNaN()和Number.isNaN函数的区别?
查看答案
函数isNaN函数接收参数后,会尝试将这个参数转化为数值,任何不能被转换为数值的值都会返回true,因此而数字值传入也会返回true,会影响NaN的判断。
函数Number.isNaN 会先判断传入参数是否为数字,如果是数字再继续判断是否为NaN,这种方法对于NaN的判断更为准确。
isNaN("abc") // true
isNaN("true") // true
isNaN(123) // true
isNaN(NaN) // true
isNaN(null) // false
Number.isNaN("abc") // false
Number.isNaN("true") // false
Number.isNaN(123) // false
Number.isNaN(null) // false
Number.isNaN(NaN) // true
2
3
4
5
6
7
8
9
10
11
# 13. JS的内部属性[[Class]]是什么?
查看答案
在JavaScript中,每个对象都有一个内部属性[[Class]]
,它是用于描述对象的一个标签。
这个属性不是直接访问的,而是通过Object.prototype.toString
方法间接得知的。
原始类型是没有的,当我们调用Object.prototype.toString
方法时,它会将原始类型包装为相应的对象类型(除了undefined
和null
),然后返回该对象类型的[[Class]]
信息。因此看起来像是原始类型也有[[Class]]
属性,但是实际上是通过这种包装机制间接实现的。
而undefined
和null
,返回是规范定义行为,传入null
返回的是Null
字符串,传入undefined
,返回Undefined
字符串。
// 引用类型
Object.prototype.toString.call({});
// 输出 [object Object]
Object.prototype.toString.call([]);
// 输出 [object Array]
Object.prototype.toString.call(function() {});
// 输出 [object Function]
Object.prototype.toString.call(/regex-literal/i);
// 输出 [object RegExp]
// 原始类型
Object.prototype.toString.call(42);
// 输出 [object Number]
// 42被包装为一个Number对象,返回的[[Class]]是Number
Object.prototype.toString.call("hello");
// 输出 [object String]
// 42被包装为一个String对象,返回的[[Class]]是String
Object.prototype.toString.call(false);
// 输出 [object Boolean]
// 42被包装为一个Boolean对象,返回的[[Class]]是Boolean
Object.prototype.toString.call(Symbol());
// 输出 [object Symbol]
// 42被包装为一个Symbol对象,返回的[[Class]]是Symbol
// undefined和null
Object.prototype.toString.call(null);
// 输出 [object Null]
Object.prototype.toString.call({});
// 输出 [object Undefined]
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 14. JS整数的安全范围有哪些?
查看答案
安全整数是指在这个范围内的整数转化为二进制存储的时候不会出现精度丢失的问题。
能够被“安全”呈现的最大整数是2 ^ 53 - 1,即 9007199254740991,在ES6中被定义为 Number.MAX_SAFE_INTEGER,最小整数是 -9007199254740991,在ES6中被定义为Number.MIN_SAFE_INTEGER。
如果计算结果超出了安全范围,那么这个值会自动转换为特殊的Infinity值,如果返回了正负Infinity值,那么该值将无法参与下一次的计算,需要判断是不是有穷的,可以使用isFinite函数来判断。
# 15. 介绍JS有哪些内置对象?
查看答案
js 中的内置对象主要指的是在程序执行前存在全局作用域里的由 js 定义的一些全局值属性、 函数和用来实例化其他对象的构造函数对象。
标准内置对象的分类
- 值属性:这些全局属性返回一个简单值,这些值没有自己的属性和方法,例如 globalThis、Infinity、NaN、undefined、null字面量。
- 函数属性:全局函数可以直接调用,不需要再调用时指定所属对象,执行结束会将结果直接返回给调用者,例如 eval()、parseFloat()、parseInt()等。
- 基本对象:基本对象是定义或使用其他对象的基础。基本对象包括一般对象、函数对象和错误对象,例如 Object、Array、Function、Boolean、Symbol、Error等
- 数字和日期对象:用来表示数字、日期和执行数学计算的对象,例如 Number、Math、Date
- 字符串:用来表示和操作字符串的对象,例如 String、RegExp
- 可索引的集合对象:这些对象表示按照索引值来排序的数据集合,包括数组和类型数组,以及类数组结构的对象。例如 Array
- 使用键的集合对象:这些集合对象在存储数据时会使用到键,支持按照插入顺序来迭代元素。例如 Map、Set、WeakMap、WeakSet
- 矢量集合:SIMD 矢量集合中的数据会被组织为一个数据序列。例如 SIMD 等
- 结构化数据:这些对象用来表示和操作结构化的缓冲区数据,或使用 JSON 编码的数据,例如 JSON 等。
- 控制抽象对象:例如 Promise、Generator 等
- 反射:例如 Reflect、Proxy
- 国际化:为了支持多语言处理而加入 ECMAScript 的对象。例如 Intl、Intl.Collator等
- WebAssembly
- 其他例如 arguments