概述
- 数据类型的分类
- 基本数据类型
- Symbol的基本使用
- bigInt要去解决的问题
- undefined,null,NAN的区别
- new String()、String、''去声明字符串有什么不同
- 判断数据类型的方法
- 基本数据类型
- 数据的隐式转换
- 使用var、let、const去声明变量
- 变量提升
- var、let、const的使用
数据类型的分类
数据类型如果按照存储类型分类的话:可以分为基本类型和引用类型两类。
基本数据类型的值是存放在栈内存中的;引用数据类型的值是存放在堆内存中的,栈内存中仅仅存放着它在栈内存中的引用(即它在堆内存中的地址)
基本数据类型 string、number、boolean、undefined、null、symbol(ES6)、bigint(ES10) 引用数据类型 object
基本数据类型中的一些问题
Symbol的基本使用
Symbol常用于为对象去创建一个独一无二的隐藏属性
具体场景:
在手写call的思路是:
1.明确call的用途fn.call(object,...arguments)
2.要为这个object设置一个属性为fn,object.fn = fn
3.然后通过object.fn(...arguments),去调用这个fn函数
4.去删除这object.fn的属性
在第二步中为了防止object中已经有了一个fn属性,可以为object创建一个独一无二的Symbol属性
let attr = new Symbol()
obj[attr] = fn
bigInt要去解决的问题
bigInt要去解决的问题为:大数问题
- 什么是大数问题?
因为
JavaScript的Number类型是遵循IEEE 754规范表示的,这就意味着JavaScript能精确表示的数字是有限的,JavaScript可以精确到个位的最大整数是9007199254740992,也就是2的53次方,超过这个范围就会精度丢失,造成JavaScript无法判断大小,从而会出现下面的现象:
Math.pow(2, 53); // 9007199254740992
Math.pow(2, 53) === Math.pow(2, 53) + 1; // true 9007199254740992 === 9007199254740992 + 1; // true
- 如何解决? ##TODO
undefined,null,NAN的区别
- undefined 表示一个变量自然的、最原始的状态值,而 null 则表示一个变量被人为的设置为空对象,而不是原始状态
- NaN是Number类型,表示不是正常的数字
new String()、String、''去声明字符串有什么不同
判断数据类型的方法
- typeof可以准确地判断出基本类型,但是对于引用类型除function之外返回的都是object
- 对于基本类型,除 null 以外,均可以返回正确的结果。
- 对于引用类型,除 function 以外,一律返回 object 类型。
- 对于 null ,返回 object 类型。
- 其原理是不同的对象在底层都是用二进制来表示的,在js中二进制前3位是0即判断是为对象,null的二进制表示是全0,即前三位都是0,所以执行typeof返回的是object,实际上null为基本数据类型。
- 对于 function 返回 function 类型。
- 已知是引用类型的情况可以选用instanceof或constructor方法进行具体类型的判断
- toString 参考文章
数据的隐式转换
在哪些情况下会去发生转换?
- 数学算符
- +号规则
- 除了+号之外的规则
- 条件判断语句
在这些情况下会发生什么样的转换?
数学算符
+号规则
1.当一侧为String类型,被识别为字符串拼接,并会优先将另一侧转换为字符串类型。
2.当一侧为Number类型,另一侧为原始类型,则将原始类型转换为Number类型。
3.当一侧为Number类型,另一侧为引用类型,将引用类型和Number类型转换成字符串后拼接。
除了+号的规则
我们在对各种非Number类型运用数学运算符(- * /)时,会先将非Number类型转换为Number类型。
条件判断
只有 null undefined '' NaN 0 false 这几个是 false,其他的情况都是 true,比如 {} , []。
看几道基本的题:
1.console.log( "Hello World" % 4)会输出什么内容?
NAN
2.console.log('Hello Word + 1 + 2')
Hello Word + 1 + 2
3.console.log('Hello Word '+ 1 + 2)
Hello Word 12
变量声明
变量提升
- 什么是变量提升?
- 为什么会产生变量提升?
- let、const会产生变量提升吗?
变量提升是值JavaScript 代码执行过程中,JavaScript 引擎把变量的声明部分和函数的声明部分提升到代码开头的“行为”。
用var声明的变量提升后会被初始化为undefined,用const,let声明的变量提升,但是不会被进行初始化。所以在变量初始化时,读取变量的值的时候会产生不同的表现。
function do_something() {
console.log(bar); // undefined
console.log(foo); // ReferenceError
var bar = 1;
let foo = 2;
}
function test(){
var foo = 33;
if (foo) {
let foo = (foo + 55); // ReferenceError
}
}
test();
就像const一样,let不会在全局声明时(在最顶部的范围)创建window对象的属性。
let a = 1
var b = 1
console.log(window.a)//undefined
console.log(window.b) // 1