Js中基本数据类型:
undefined null string boolean number
复杂类型:
object function date reg(正则) [] (数组)
检测:
typeof * ;
一、字符串类型
属性1: length
转义:
\n 换行 \> 转义> \* 转义符号
类型转换:
toString() ; =>string
适用于: Number/Boolean/String/Object
String():
null. Undefined (他们两个没有tostring方法)
eval():
计算字符串表达式的值并以数值形式返回;
//eval var evalVal="1+2+5+8+10"; console.log(typeof evalVal);//string var evalComputed=eval(evalVal); console.log(evalComputed,typeof evalComputed);//26 "number"
二、number
包含:正数、负数、零、小数、以及特殊的NaN;
我们用的都是十进制
关于NAN
- Not a Number
- 非数值,不是一个数值,但是NaN属于数值类型;
- ◦ 特点
- 任何涉及NaN的操作都将返回NaN
- NaN与任何数值都不相等包括其自身
console.log(NaN==NaN) /false - 0 == NAN //false
检测 isNaN
- 可以转换为数值,为false
- 不能转换为数值,为true
NaN:not a number不是一个数;但是属于number数据类型;用typeof检测的返回结果是number;NaN和NaN不相等;例如:NaN==NaN-->false;typeof NaN 等于:number;
常用方法:
Number() 要求数值必须是纯数字 number(123);
parseInt() 从前往后开始:会忽略浮点号;遇到第一个非数值的符号后直接退出转换,其中"."也是不合法的数值符号): 遇到非数字就结束
- parseFloat() 可以转换为浮点数123.12dw可以转换为123.12;
隐式转换: + -
number.toFixed(num) 保留num位小数 Math.ceil(num) 向上取整 Math.floor(num) 向下取整 number([1,2,3])// NAN parseInt([1,2,3]) // 1 parseFloat([1,2,3]) // 1 number(true) // 1 number(false) // 0 number(‘’) // 0 number(‘ ‘) // 0 number(‘ 111ss’) // nan number(‘ 7777’) //7777 number(’99’) // 99
注意点:
- Boolean转换为数值的时候
- true转为1;
- flase转为0;
- null转换为数值的时候 转换为0
- undefined转换为数值的时候 转为NaN
string转换为数值的时候
- 如果只包含数字
- 转为十进制数
- 前导0被忽略
- 如果包含有效浮点格式
- 浮点数值
- 忽略前导0
- 包含有效十六进制格式;相同大小的十六进制整数
- 空字符串转为0;备注:""是空字符串 " "这个就不是空字符串了
- 其他格式字符串NaN
Object
调用对象的valueOf()方法,然后依照前面的规则转换返回的值,如果转换的结果是NAN,则调用对应的toString方法,然后再次依照前面的规则转换返回的字符串值;
- ValueOf()
- ToString()
三、boolean
- rue为真,flase为假(false是布尔值,而Flase只是标识符);通常用在if/else的判断语句中(如果需要的话,通常还会配合逻辑与&&,逻辑或||来完成)
- true不一定=1;flase不一定=0;
False == 0 //true
False === 0 //false
- 使用boolean()进行转换;
- 任何数据类型的值调用Boolean()函数,都会返回一个Boolean值;也可以用(!/!!来转换)
- 转为true的
- Boolean的true本身
- 任何非空字符串
- 任何非零数值
- 对象
- 转换为flase
- false本身
- 空字符串
- 0和NaN(0=-0吗?可以输出看一下,是等于的)
console.log(0===(-0));//true - null和undefined;
为false值:
false本身、空字符串、0、NaN、null、undefined;这些值要记住,很重要;
Null === undefined //false null == undefined //true
关于类型的比较:
对象比较: 【】 == 【】//false 内存的地址不同
对象和字符串 先转换为字符串 toString()// arr
对象和布尔类型 number() 先转为数字
对象和数字 同上
数字和布尔 同
布尔和字符串 同
Null 和undefined //true
Null / undefined 和任何其他类型比较 都为 !!! False 因为他们没有tostring() 方法
False == null //false
0.1+0.2 == 0.3 //false
0.30000000000000004 == 0.3
四、null 和 undefined
null是空值,是一个空指针,一般表示一个变量定义了但是没有值(值为空);undefined是未定义;
- null(空值,曾经赋过值,但是目前没有值)
- 逻辑上null表示一个空对象的指针
- 使用typeof检测的时候会返回object;(object原型的终点也是null)
- undefined(没有值,指从没有赋过值)
- 使用var声明变量但没有初始化/赋值的
- 区分空对象指针与尚未定义的变量
- 对未初始化的变量以及未声明的变量使用typeof运算符均会返回undefined;
意思是说: var a; // undefined console.log(b) //b not defined
Null是特殊的关键字 undefined是标识符
Null 是obj类型。 undefined是undefined类型
不要声明 null 和 undefined的变量, 声明的时候,变量值时null,应该主动用null来负值而不是undefined
注意: 在函数里,如果函数没有返回值(比如return return空值) 那么它会输出undefined , 有返回但是计算不出或者不存在 返回null (Document.getElementById(“div1”)//返回null)
五、object
Object类型包括,数组、正则等等;
- 定义:一组数据或功能的集合
- 声明
- var o=new Object()//Object后面的()可以省略,但不推荐
- var o={}
- 属性和方法
- constructor:保存用于创建当前对象的函数,构造函数就是Object()
- HasOwnProperty(propertyName) 检测给定输定在当前对象实例中是否存在(而不是实例的原型中)
- isPrototypeOf(object) :检测传入的对象是否是另一个对象的原型(而不是在实例中);
- propertyIsEnumerable(propertyName);检测给定属性是否能用for-in语句每句来枚举;
- toLocaleString() 返回对象的字符串表示,该字符串与执行环境的地区对应;
- toString() 返回对象的字符串表示
- valueOf() 返回对象的字符串,数值或布尔值表示;通常与toString()的值相同;
- 在ECMAScript中,Object是所有对象的基础,因此所有对象都具有这些基本的属性和方法;方法的具体原理,后面数据类型和原型链中具体说;
- BOM/DOM中的对象,都是属于宿主对象,因为他们是由宿主实现提供和定义的,但是ECMAScript不负责定义宿主对象,因此宿主对象可能会也可能不会继承Object;
六、symbol
Symbol 是JavaScript的原始数据类型,Symbol实例是唯一且不可改变的.可以作为对象属性的标识符使用;
在没有ES6的时候,属性名是很容易被覆盖的;
为了从根本上防止属性名的冲突,就是ES6引入Symbol的原因。
在其他编程语言中 symbol也被称为原子(atoms).
在JavaScript中, Symbol 是 基本数据类型 的一种,Symbol 对象是 Symbol原始值的封装 ,Symbol 类型是 ECMAScript 6 (es6) 中新添加的特性,在ECMAScript 5中没有对应的类型。
Symbol值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型;
一是原来就有的字符串, 二是新增的Symbol类型。凡是属性名属于Symbol类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。
let aloneVal = Symbol();//注意不要用new来生成new;
console.log(typeof aloneVal);//symbol
Symbol里面的参数,是描述使用的;仅仅是为了控制输出时候方便识别,没有别的用了; const s1 = Symbol('foo'); const s2 = Symbol('bar'); console.log(s1,s2);//Symbol(foo) Symbol(bar) //Symbol不可以进行运算,但是可以转换为字符串和布尔值,但是不能转为数值; const sym=Symbol("flag"); //console.log(sym+"hello baby");// Cannot convert a Symbol value to a string console.log(String(sym)+"hello one");//Symbol(flag)hello one console.log(sym.toString()+"hello two");//Symbol(flag)hello two console.log(Boolean(sym),typeof Boolean(sym));//true "boolean" console.log(Number(sym));//Cannot convert a Symbol value to a number