目录
ES5:Null,Undefined,Number,String,Boolean
ES5:Object,function,Array,Date,RegExp
改变Array的方法:进出*4,splice,sort,reverse,fill
Map/set(有序):任何值类型都可以作为键/值,size,可迭代,删减优化,
Object(无序):键:String、Symbol,JSON序列化JSON.stringify()和解析JSON.parse()
引用string实例的属性、方法时:字面量string会临时转换为对象
typeof:判断 基本数据类型+ 广义函数(function、promise、箭头函数)
typeof NaN==Number:全局方法isNaN()
构造函数.prototype.isPrototypeOf(实例) :判断原型链
(数据).constructor === 数据类型:不包含继承类型
基本数据类型、function,Array,RegExp:返回数据本身
Object,(Weak)Map、(Weak)Set:[object 类型]
Date:...中国标准时间(ECMAScript规范定义的日期时间字符串格式)
Number(任意类型):任意类型->string、若string含非数字,会返回NaN
BigInt 抛出 TypeError,以防止意外的强制隐式转换导致精度损失
parseInt(string[,radix]):基数radix是2-36之间的整数
parseFloat(string):解析一个参数并返回一个浮点数,无法识别 0x 前缀
parseInt(string[,radix]):基数radix是2-36之间的整数
parseFloat(string):解析一个参数并返回一个浮点数
Boolean():0, ''(空字符串), null, undefined, NaN会转成false,其它都是true
null、undefined、boolean基本类型:转Number
obj、function、arr、Date等引用类型:转string
因为只有[]\[num]这两类特殊的数字才能转换为Number、所以为了统一,arr:转string优先于Number
全局属性 NaN :非数字的值,它与任何其他值(包括自身)都不相等
isNaN(string/Number/boolean/null)
Object.is(val0, val1):NaN等,±0不等
基本数据类型占用空间小、大小固定,通过值来访问,属于被频繁使用的数据
闭包中的基本数据类型变量是保存在堆内存里的,当函数执行完弹出调用栈后,返回一个内部函数的一个引用,这时候函数的变量就会转移到堆上,因此内部函数依然能访问到上一层函数的变量。
- console.log(symbol2 === 42);
- // Expected output: false
-
- console.log(Symbol('foo') === Symbol('foo'));
- // Expected output: false
- let bnum=1684424684321231561n //方式1:数组后加n
- bunm=BigInt("1684424684321231561")//方式2:调用BigInt
二叉堆,引用数据类型占据空间大、大小不固定,如果存储在栈中,将影响程序的运行性能。
引用数据类型会在栈中存储一个指针,这个指针指向堆内存空间中该实体的起始地址。

Array的方法:进出*4,splice,sort,reverse,fillArray:变长,不一定连续(当不同类型时,是哈希表存储)数组元素的键(索引)不仅可以是连续的整数,还可以是字符串或其他类型的值。这种非连续整数索引的灵活性使得 JavaScript 数组更像是一个关联数组或哈希表,而不仅仅是一个线性的、固定大小的内存块。
- let myArray = [];
- myArray[0] = "Apple";
- myArray["1"] = "Banana";
- myArray[2] = "Cherry";
Map/set(有序):任何值类型都可以作为键/值,size,可迭代,删减优化,迭代:for in,for of,forEach
Object(无序):键:String、Symbol,JSON序列化JSON.stringify()和解析JSON.parse()迭代:for in,
底层优化
映射设置值时会将键和值添加到这两个数组的末尾。从而使得索引相对应。
取/赋值,需要
O(n)强引用(哪怕不被引用了,也会阻止垃圾自动回收),导致内存泄漏
WeakMap:键必须是对象或非全局symbol(此处的键值对都是对象)
当键被回收+值没被引用,则值回收
当值回收,不影响键
symbol是保证唯一的,并且不能被重新创建,和对象引用地址一样
非全局意味着有生命周期,可以被释放 对应着 对象不再被引用,然后被回收
WeakSet:值必须是对象或非全局symbolweak弱引用对象,不被引用时会被回收,所以weakmap键和weakset值必须是对象
WeakMap因为获取键的列表会依赖于垃圾回收的状态,所以不允许观察其键的生命周期,不允许枚举;
包装target (对象/数组/函数甚/proxy对象)
被代理对象上的自定义行为(定义一组处理函数(例如get、set)的对象)
- const target = {
- notProxied: "original value",
- proxied: "original value",
- };
-
- const handler = {
- //target:被代理者(就是上面的target)
- //prop:被代理者的属性
- //receiver:代理者 Proxy 或者继承 Proxy 的对象
- get: function (target, prop, receiver) {
- if (prop === "proxied") {
- return "replaced value";
- }
- return Reflect.get(...arguments);//调用原始对象上相同的属性,保持属性的原始值不变
- },
- };
-
- const proxy = new Proxy(target, handler);
-
- console.log(proxy.notProxied); // "original value"
- console.log(proxy.proxied); // "replaced value"
字面量:数据固定值,不用构造函数创建
基本类型:不属于引用类型
//基本类型 console.log(typeof 'str'); // 输出 "string" //引用类型 console.log(String.prototype.isPrototypeOf('str')); // false console.log('str' instanceof String); // false引用string实例的属性、方法时:字面量string会临时转换为对象
console.log(String.prototype.isPrototypeOf('str')); // false console.log('str'.length); // 3 console.log('str'.includes('s')); //true引用类型:仍然是引用类型
console.log(typeof {}); // 输出 "object"
typeof null=Object 类型标签均为000
typeof NaN==Number:全局方法isNaN()
- // 基本类型的字面量
- console.log(typeof undefined); // 输出 "undefined"
- console.log(typeof null); // 输出 "object"(历史遗留 Bug)
- console.log(typeof true); // 输出 "boolean"
- console.log(typeof 42); // 输出 "number"
- console.log(typeof NaN); // 输出 "number"
- console.log(typeof 'string'); // 输出 "string"
- console.log(typeof Symbol()); // 输出 "symbol"
- console.log(typeof BigInt(42)); // 输出 "bigint"
- // 特殊引用类型 function
- console.log(typeof function(){}); // 输出 "function",匿名函数
- console.log(typeof (() => {}).prototype); // 输出 "function",但并非function实例对象
- console.log(typeof Promise); // 输出 "function",异步函数设计
- console.log(Function.prototype.isPrototypeOf(new Promise(()=>{}))); // false
- // 引用类型
- console.log(typeof {}); // 输出 "object"
- console.log(typeof []); // 输出 "object"
- console.log(typeof new Date()); // 输出 "object"
- console.log(typeof /regex/); // 输出 "object"
- console.log(typeof new Map()); // 输出 "object"
- console.log(typeof new Set()); // 输出 "object"
- console.log(typeof new WeakMap()); // 输出 "object"
- console.log(typeof new WeakSet()); // 输出 "object"
实例 instanceof 构造函数:判断原型链- Object.prototype.isPrototypeOf({})// true
- {} instanceof Object// true
构造函数.prototype.isPrototypeOf(实例) :判断原型链- (1).constructor ===Number//true
-
- //()转换为Number
- //基本数据类型
- //ES5:Null,Undefined,Number,String,Boolean
- //ES6:Symbol
- //ES10:Bigint
- console.log(Symbol('foo').toString());//"Symbol(foo)"
- console.log(Symbol('foo').valueOf());//Symbol(foo)
this 值转换为对象
- let set=new Set()
- set.add(1)
- console.log(set.toString()); //"[object Set]"
- console.log(set.valueOf()); //[object Set]
-
- let mp=new Map()
- mp.set("1",1)
- console.log(mp.toString()); //"[object Map]"
- console.log(mp.valueOf()); //[object Map]



- //"Sun Dec 17 1995 03:24:00 GMT+0800 (中国标准时间)"
- console.log(new Date("December 17, 1995 03:24:00").toString());
像 37 这样的数字字面量是浮点数值,而不是整数。JavaScript 没有单独的整数类型。
0- console.log(Number({}))//NaN
- console.log(Number([]))//0
- console.log(Number([1]))//1
- console.log(Number(null))//0
- console.log(Number(undefined))//NaN
Number(new Date("December 17, 1995 03:24:00"));//819199440000
0 不会导致该数值成为八进制字面量- Number("0x11"); // 17
- Number("0b11"); // 3
- Number("0o11"); // 9
+ 和 - 是独立的一元运算符,后面不能跟空格不允许使用数字分隔符
0x 前缀- console.log(parseInt('6f'));//6
- console.log(parseFloat('6f'));//NaN
- console.log(Number('6f'));//6
str = '123'
- console.log('apple' < 'banana'); // true,因为 'a' 在 Unicode 中比 'b' 小
- console.log('apple' < 'apples'); // true,因为 'apple' 是 'apples' 的前缀
- console.log('apple' < 'apricot'); // true,因为 'l' 在 Unicode 中比 'r' 小
- console.log(Number([1]))//1
- console.log(Number([]))//0
- console.log(Number(null))//0
- console.log(Number({}))//NaN
- console.log(Number(undefined))//NaN
- console.log(1+null); //1
- console.log(undefined+1); //NaN
- console.log({}+1)//[object Object]1
- console.log(1+{a:1,b:2})//1[object Object]
- console.log(typeof(1+{a:1}))//string
- console.log(1+function(){console.log()}); "1function(){console.log()}"
- console.log([]+1); // "1"
- console.log(1+[]); // "1"
- console.log(1+['a'])//1a
- console.log(1+['a',2])//1a,2
- console.log(1+[2,2])//12,2
- console.log([0,1]+[2,2])//0,12,2
- //number与其他数据相加减
- //:能转number就转,不能则转string相加,object,arr(元素超过1个 或者 非number元素)
- console.log(1-{})//NaN
- console.log(1-[])//1
- console.log(1-[1])//0
- console.log(1-['a'])//NaN
- console.log(1-null)//1

NaN :非数字的值,它与任何其他值(包括自身)都不相等- const obj = {};
- console.log(Object.is(obj, {}));
- // Expected output: false
Object.is() 使用了 "SameValueZero" 比较算法,它不会对 NaN 进行特殊处理,而是按照严格的值相等性规则比较
- console.log(NaN===NaN);
- // Expected output: false
-
- console.log(NaN==NaN);
- // Expected output: false
-
- console.log(Object.is(NaN, NaN));
- // Expected output: true
-
- console.log(Object.is(-0, +0));
- // Expected output: false
-
- console.log(Object.is(null, undefined));
- // Expected output: false
- 255 === 255.0; // true
- 255 === 0xff; // true(十六进制表示)
- 255 === 0b11111111; // true(二进制表示)
- 255 === 0.255e3; // true(十进制指数记数法)
- const obj = {};
- console.log(Object.is(obj, {}));
- // Expected output: false
- //Set用===判断是否相等
- const set= new Set();
- const obj1={ x: 10, y: 20 },obj2={ x: 10, y: 20 }
- set.add(obj1).add(obj2);
-
- console.log(obj1===obj2);//false
- console.log(set.size);// 2
-
- set.add(obj1);
- console.log(obj1===obj1);//true
- console.log(set.size);//2