================
类型
未定义 undefine
一般来说,永远不用显式地给某个变量设置 undefined 值,只是区分未定义和空指针null。
用于判断时,是一个假值false
特殊:
let message; // 这个变量被声明了,只是值为 undefined
// 确保没有声明过这个变量
// let age
console.log(typeof message); // "undefined"
console.log(typeof age); // "undefined"
let message; // 这个变量被声明了,只是值为 undefined
// age 没有声明
if (message) {
// 这个块不会执行
};
if (!message) {
// 这个块会执行
};
if (age) {
// 这里会报错,要确定自己是要检测是否存在,还是是否假值
};
空 null
1、在定义将来要保存对象值的变量时,建议使用 null 来初始化,不要使用其他值。
这样,只要检查这个变量的值是不是 null 就可以知道这个变量是否在后来被重新赋予了一个对象的引用
2、用于判断时,是一个假值false
数值 Number
整数int,浮点数float
var a = 1;
var b = 1.2;
var c = 3e2; //3乘以10的2次方
var d16 = 0x111 //16进制
var d8 = 0o111 //8进制
var d2 = 0b111 //2进制
基本方法:https://www.w3cschool.cn/jsref/jsref-obj-number.html
额外方法:https://www.yuque.com/yejielin/mypn47/mkkfc6#646b02d0
1、进制
打印出来的是十进制数
2、浮点
1、因为存储浮点值使用的内存空间是存储整数值的两倍,所以 ECMAScript 总是想方设法把值转换为整数。
2、不要用浮点进行计算,不精确。
let floatNum1 = 1.; // 小数点后面没有数字,当成整数 1 处理
let floatNum2 = 10.0; // 小数点后面是零,当成整数 10 处理
let sum = 0.1 + 0.2 ;//0.30000004
3、科学计数
let floatNum1 = 3.125e7; // 等于 31250000
let floatNum2 =3e-17; //如 0.000 000 000 000 000 03,最高17位小数
//默认情况下,ECMAScript 会将小数点后至少包含 6 个零的浮点值转换为科学记数法
4、范围
(1)
可以表示的最小数值保存在 Number.MIN_VALUE 中,这个值在多数浏览器中是 5e324;
可以表示的最大数值保存在Number.MAX_VALUE 中,这个值在多数浏览器中是 1.797 693 134 862 315 7e+308。
(2)
如果某个计算得到的数值结果超出了 JavaScript 可以表示的范围,那么这个数值会被自动转换为一个特殊的 Infinity(无穷)值。
任何无法表示的负数以-Infinity(负无穷大,Number.POSITIVE_INFINITY)表示,
任何无法表示的正数以 Infinity(正无穷大Number.NEGATIVE_INFINITY)表示。
要确定一个值是不是有限大(即介于 JavaScript 能表示的
最小值和最大值之间),可以使用 isFinite()函数
let result = Number.MAX_VALUE + Number.MAX_VALUE;
console.log(isFinite(result)); // false
5、NaN
not a num
console.log(0/0); // NaN
console.log(-0/+0); // NaN
console.log(5/0); // Infinity
console.log(5/-0); // -Infinity
console.log(NaN/10); // NaN
console.log(NaN == NaN); // false
console.log(isNaN(NaN)); // true
console.log(isNaN(10)); // false,10 是数值
console.log(isNaN("10")); // false,可以转换为数值 10
console.log(isNaN("blue")); // true,不可以转换为数值
console.log(isNaN(true)); // false,可以转换为数值 1
//此时,首先会调用对象的 valueOf()方法,
//然后再确定返回的值是否可以转换为数值。
//如果不能,再调用 toString()方法,并测试其返回值。
6、ES12 大数值逗号
一般数字会通过100,000这样,每个3位给一个逗号隔开,方便直观看到多大的数值
但是JS不支持,ES12提供了另一种方式,如下,用_下划线隔开
字符串 String
尽量用双引号,因为很多语言只支持双引号(如java)
var c = "张三" ;
var d = '李四' ;
var e = "你好,我是'呵呵'";
var f = "你好,我是\"呵呵\" " ; //转义字符
字符串相当于是一个字符数组,可以用c[1]的形式返回字符串中的值,例子就是’三’,c.length 为2。
不要用new String创建 String 对象。它会拖慢执行速度,并可能产生其他副作用:
字符串的一些方法:https://www.w3cschool.cn/javascript/js-strings.html
常用方法
分割/提取
a.split(“分隔符”),返回分割后的数组
ES8 填充
padStart是从头开始填充,padEnd是从最后开始填充
第一个参数是填充到多少位
不加第二个参数默认是填充空格
ES10 去除空格
ES6 模板字符串(重要)
3、拼接
原本的拼接
优化后的拼接
(里面还可以放表达式)
(里面还可以放函数)
标签模板函数
可以通过 函数名模板字符串
的方式调用函数
第一个参数是,字符串被空格、${}分割后,的字符,然后组成数组。
第二个参数是,第1个${}里面的结果
第三个参数是,第2个${}里面的结果
如此类推
我们这样用的情况比较少,但是一些第三方库如react的库,会用到
(div是这个库的一个函数)
(div是这个库的一个函数)
布尔 Boolean
var aa = true; //内部储存是1
var ab = false; //内部储存是0
对象 Object
由大括号组成,里面的构造是 键 : 值 组成
var Obj = {};
var Obj1 = {name:"yjl",age:30};
https://www.yuque.com/yejielin/mypn47/mkkfc6
符号 Symbol (ES6)
创建
1、普通创建
let s1 = Symbol();
let s2 = Symbol();
console.log(s1 == s2); // false
// ES10,可以传入一个描述
let s3 = Symbol('foo');
let s4 = Symbol('foo');
console.log(s3 == s4); // false
// 查看描述
s3.description; // foo
2、使用全局符号创建
相同的描述,可以有相同的值
true
2个创建方式的区别
区别就是会根据for后面的内容创建,如果内容一样,指向就是一样的。
let localSymbol = Symbol('foo');
let globalSymbol = Symbol.for('foo');
console.log(localSymbol === globalSymbol); // false
使用场景
安全高效给对象添加属性和方法,避免覆盖掉原理对象的属性和方法
给obj添加属性
调用属性
调用
let c = Symbol();
let num = reactive({
a:1,
b:2,
[c]:function(){
console.log('ccccc');
}
});
function add() {
num.a += 1;
console.log(num);
num[c](); //调用
};
获取
获取Symbol.for() 创建的描述
ES11 大整型 BigInt
使用场景
最大安全整数
传统的最大安全整数,不能再增加了
=================
变量储存
基本数据类型:Number、String、Boolean、Null、Undefine,储存在栈空间
引用数据类型:Object ,储存在堆空间(包括数组)
=================
查看类型 typeof
JavaScript 中有五种可包含值的数据类型:
字符串(string)
数字(number)
布尔(boolean)
对象(object)
函数(function)
有三种对象类型:
对象(Object)
日期(Date)
数组(Array)
同时有两种不能包含值的数据类型:
null
undefined
特殊:
console.log(typeof null); //Object
console.log(typeof undefined); //undefined
console.log(null == undefined); // true
=================
类型转换
其他转数字
任何转数值 Number( )
字符串转数值 parseInt( )(优先) / parseFloat( )
因为不传底数参数相当于让 parseInt()自己决定如何解析,所以为避免解析出错,建议始终传给它第二个参数
其他转字符串
默认情况下,toString()返回数值的十进制字符串表示。而通过传入参数,可以得到数值的二进制、八进制、十六进制,或者其他任何有效基数的字符串表示
其他转布尔
typeof xx,可以查看xx的数据类型
.constructor 可以返回构造函数
+ 可以把变量转换成数字,如x = + y;
//数值 转 字符串
var a = 5;
console.log(typeof a.toString());
console.log(typeof String(a));
console.log(typeof (a+""));
//其他转数值
var b = "4";
console.log(typeof Number(b));
console.log(typeof Number(a)); //输出为NaN,not a number
console.log(typeof Number(undefined)); //输出为NaN,not a number
console.log(typeof Number(null));//输出为0
var c = "4a"
console.log(typeof parseInt(b),parseInt(c,10),parseInt(null)); //输出为4 4 NaN
//其他转布尔
console.log(typeof Boolean("0")); //true,只要有内容就是true,除了数值0
console.log(typeof Boolean("")); //false
console.log(typeof Boolean(0)); //false
console.log(typeof Boolean(null)); //false
console.log(typeof Boolean(undefined)); //false
请注意:
NaN 的数据类型是 number
数组(Array)的数据类型是 object
日期(Date)的数据类型为 object
null 的数据类型是 object
如果对象是 JavaScript Array 或 JavaScript Date ,我们就无法通过 typeof 来判断他们的类型,因为都是 返回 Object。