js的数据类型
- 基本数据类型
- number 数字类型 2,1.2, -2,+4
- string 字符串 '正确的值 ’ // " 中文" //黑色是字符串
- boolean 布尔 true false
- null 空对象指针
- undefined 未定义
- 引用数据类型
- object对象
- 普通对象 {name: ‘xxxx’ }
- 数组 [’ ’ ,1,true,null,undefined]
- Math 数学对象
- Date的实例
- /^$/ 正则
- 函数
- 原型
- arguments
- 元素集合
- function 函数
- 普通函数
- 构造函数(类)
- 类
- object对象
js的部分数据类型的详细介绍
number数字类型
有效数字 3,5.5 , -4.4 , 0 ,+7
NAN (not a number) 不是一个数,但是他是number数据类型的
NAN和谁都不相等 (包括他自己)
-把其他数据类型转数字类型
- Number(val)
- parseInt(val)和parseFloat(val)
1、 Number(val)
- 把字符串转数字
- 把字符串转数字只要字符串中出现了非有效数字,那结果就是NAN (第一个小数点不算,第一个-,+不算)
- 如果左右有空格,会自动去掉,中间不可以去掉
- 空字符串数字是0
- 把布尔转数字
- true转数字是1
- false转数字是0
- 把null和undefined转数字
- null 转数字0
- undefined转数字是NAN
- 把对象转数字
- 把普通数据类型转数字,先把值转字符串,在把字符串转换为数字
- 所有的普通对象转字符串都是 ‘[object Object]’
- 所有的普通对象转数字都是NAN
- 把数组转数字,把值转换为字符串,再把字符串转换为数字
- 把数组转字符串是把左右两边的中括号去掉,替换为引号即可(逗号不能丢)
- [null,undefined] => ‘,’=>NaN
[null]=>’’=>0
[{},{}]=>’[object Object],[object Object]’
- 把普通数据类型转数字,先把值转字符串,在把字符串转换为数字
2、parseInt(val)和parseFloat(val)
1> 把字符串转换为数字
2> 从左到右依次查找有效数字,一旦发现非有效数字,立即停止查找,把找到的数字返回出去,(parseInt不可以识别小数、只能取整,parseFloat可以识别小数)
3> 如果从一开始就是非有效数字,那结果就是NaN
4> 如果你要转换的值不是字符串类型的,先转换为字符串类型类型,再查找
5> true、false、null、undefined、{}、NaN 转都是NaN
6> 数组是先转换为字符串,再进行查找
3、四则运算(除了加法)
isNaN(val)
1> 检测一个值是否是一个非有效数字,如果是就是true,反之就是false(这个值如果是有效数字那结果就是false,反之就是true)
2> 如果你要检测的值不是数字类型,先转换为数字类型,在检测
string 字符串
- 所有 单引号、双引号、反引号(`` ES6的模板字符串)包起来的都是字符串
- 天生自带一个length属性,代表字符串的长度或者个数
- 空格也是字符 ’ ’ 不是空字符串,里面有空格 Boolean(’ ') true
-把其它类型值转为字符串
- val.toString()
- 字符串拼接
1.val.toString()
- 把number、boolean(true、false)转字符串都是直接加引号
- null 和undefined不能使用toString方法,转成空字符串
- [null,undefined] => ‘,’=>NaN
- [null]=>’’=>0
- 把普通对象转字符串 => ‘[object Object]’
- 数组转字符串=> 把中括号去掉,然后把数组的每一项都去toString处理,然后拼接到一块(,不能丢)
console.log([{}, []].toString()) // '[object Object],'
console.log([null, undefined].toString()) // ','
let scr ='asd';
console.log(str[0])
2.字符串拼接
- 四则运算:在四则运算中,除了加号,其余的都是正常的运算
- 在运算中过程中,如果运算的值不是数字类型的,先转为数字类型,再运算
- 在运算过程当中,如果出现了NAN,那结果就是NaN
- 在加法中有两种情况:
- 正常运算
- 字符串拼接:如果加号一旦跟引号相遇了,那就是字符串拼接,不再是正常的运算(基本数据类型是这样的,直接拼接不用转数字)
- 如果拼接的过程当中,遇到引用数据类型要转数字(但是转数字要先转成字符串,一旦字符串和加号相遇了,就是字符串拼接)
- 11+[],空数组变为数字,要先经历变为空字符串,遇到字符串,啥都别想了直接字符串拼接。
boolean 布尔 (true false)
-把其他数据类型转布尔 Boolean !/!!
- Boolean([val])
- 把其他数据类型转布尔有且只有NAN、null、undefined、0、’'这五种是false,其余的都是true
- 把布尔转布尔还是本身
- ’ ’ 不是空字符串,里面有空格 Boolean(’ ') true
Boolean(true) // true
Boolean(false) // false
Boolean(NaN) // false
Boolean(null) // false
Boolean(undefined) // false
Boolean(0) // false
Boolean('') // false
其他的转布尔全是true
!/!!
- !:把其他数据类型先转布尔,然后取反
- !null//true
- !! 把其他数据类型转布尔,然后取反再取反
null和undefined
他俩都代表空
- null: 他一般都是意料之中的(一开始我们不知道值,先手动赋值null,但是以后知道了,再给他重新赋值)
1// 一开始我买了一辆夏利,但是有油箱里没有油,我先给他手动赋值null,经过我几个月的努力,我挣钱了,我拿着五毛钱买了一升油,现在我给邮箱赋值1
2let gasoline = null;
3gasoline = 1;
- undefined: 他也是空,但是一般都是浏览器的默认机制定义的(意料之外的)
1//孙悟空本身就没有父亲,他是石头缝里蹦出来的,但是你还是去找他的爸爸,这就是意料之外的事,找不到就是undefined
2//猪悟能我们大家都知道有父亲,但是不知道具体是,先赋值,打听后,知道了再赋值
3let pigFather = null;
4pigFather = ‘xiaoHua’
引用数据类型([],{})
- 每一个对象都有大括号包裹,里面是0到多个键值对组成,多组拿逗号隔开
- 每个键值对由属性名和属性值组成(中间拿冒号链接/分割) [key:value]
- 属性名可以是字符串也可以是数字(’'可以省略)
- 属性值就是js数据类型的一种
- 增删改查
- 查询属性名所对应的属性值:
对象名.属性名/对象名[‘属性名’];如果属性名是数字,不能用对象名.属性名的方式去获取对应的值 - 新增和修改 对象名.属性名 = ‘xxx’
新增的属性名如果存在,就是修改属性值,如果没有就是新增 - 删除
- 假删除 对象名.属性名 = null;
- 真删除 delete 对象名.属性名
(以上的操作 “对象名.属性名”都可以改为对象名[‘属性名’];两种方式,用哪个都可以)
- 查询属性名所对应的属性值:
object对象数据类型-普通对象
- {[key]:[value],…} 任何一个对象都是由零到多组键值对 (属性名:属性值)组成的 (并且属性名不能重复)
- 属性名是由数字或者字符串格式。属性名都是字符串,""省略不写
- 如果当前属性名不存在,默认的属性值就是undefined
- 如果属性名是数字,则不能用点的方式来获取,写成 对象名[‘属性名’],除了数字其他都可以用 对象名.属性名
- 新增修改
- 属性名不能重复,如果属性名已经存在,不属于新增属于修改属性值
- 删除属性
- 真删除:把属性彻底干掉 delete person[1];
- 假删除:属性还在,值为空 person.weight = null;
console.log(person.1)//=>SyntaxError:语法错误
let monkey = {
name: 'sunWuKong ',
age: null,
speed: 10000,
ifantName: ‘badMonkey’,
3: ‘xxx’
}
获取属性名所对应的属性值获取不到就是undefined
如果属性名重复下面的会覆盖上面的
console.log(monkey.father) //undefined
console.log(monkey)
- 对对象进行增删改查
1、查寻属性名所对应的属性值:对象名.属性名/对象名[‘属性名’];如果属性名是数字,不能用对象名,属性名的方式去获取对应的值
console.log(monkey.name)
console.log(monkey[‘name’])
- 新增和修改 对象名.属性名 = 'xxx’
当你新增的时候,新增的属性名如果存在,就是修改属性值,如果没有就是新增。
monkey.ss = ‘333’
monkey[‘ss’] = ‘3333’;
monkey.name = 'ssss’
console.log(monkey)
- 删除
+ 假删除 对象名.属性名 = null ;
monkey.name = null;
console.log(monkey)
+ 真删除 delete 对象名.属性名
delete monkey.name;
console.log(monkey)
let box = {
people: 33,
line: slow,
background: black,
}
let obj = {
}
数组 []
数组对象是特殊的对象
- 数组外层由中括号包裹,里面存贮
- 我们中括号中设置的是属性值,它的属性名是默认生成的数字,从零开始递增,而且这个数字代表每一项的位置,我们把其称为“索引”=>从零开始,连续递增,代表每一项位置的数字属性名
- 天生默认一个属性名 length ,存储数组的长度或个数
- 第一项索引0 最后一项索引 ary.length-1
向数组末尾追加内容
ary[ary.length] = 100;
删除数组末尾内容
ary.length = ary.length-1
ary.length--
1let ary = ['2',2,true,false,null,undefined,{},[] ];
数据类型比较
//判断
if(1==2){
//如果这个小括号中值是true,那么执行这个大括号中的代码;如果false,直接执行下面那行代码;
console.log(100)
} else{
console.log(200) }
/* == : 是两个值进行比较,会默认进行数据类型之间的转换再比较;比较的结果是一个布尔值
基本数据类型 Number string boolean null undefined symbol
操作的是值
// 引数据类型分为对象数据类型和函数数据类型
对象数据类型: 普通对象 数组 正则 Math Date的实例
函数数据类型: 函数 类;
操作的是地址
1. 数字==字符串 字符串调用Number转换成数字,然后和数字进行比较
console.log(1=="1");
console.log(0==" ");
console.log(1=="[1]"); */
2.数字和布尔比较 布尔转数字,然后进行比较
// true -->1 false -->0
// console.log(1 == true); //true
// console.log(0 == false); //true
3.数字 == 对象(对象数据类型)对象先转成字符串再转成数字
//NaN 和自己不相等
// console.log(NaN == {}) //false
4.对象==对象
在js中,只要遇到{},都会开辟一个新的空间地址;
当浏览器解析代码时,会形成两个虚拟的内存分别是栈内存和堆内存
栈内存提供代码的运行环境,并存储基本数据类型值。堆内存存储引用数据类型的值。
堆内存
栈内存
let c =100;
let a = { };
let b = { };
console.log(a==b);
console.log(({ })==({ }));
console.log(c)
5.对象==字符串 :对象转成字符串,然后进行比较
/* console.log(({name:1}).toString());// "[object Object]"<br /> let str = "";<br /> let str1 = " ";<br /> console.log(str1.length);<br /> console.log(""==" ");<br /> console.log(Number(""));<br /> console.log(Number(" "));<br /> */
6.对象==布尔 : 对象转字符串,字符串转数字,布尔直接转数字
//! : 先将后面的值转成布尔值,然后再取反;<br /> /* console.log( [] == false );//true<br /> console.log( ![] == false ); //true<br /> console.log( [] == ![] ); //true<br /> console.log( [] !== []); //true
7.布尔==字符串 : 布尔值转数字 字符串转数字
console.log(false == "")//true console.log(true == "1px")//false
8.null == undefined : true
null=null //true undefined = undefined//true
null和undefined和其他值都不相等
9. NaN == NaN false
NaN和其他都不相等包括它自己
关于== 的转换
1. 数字 ==字符串 字符串调用Number转换成数字,然后和数字进行比较;
2. 数字 ==布尔 布尔转数字,然后进行比较
3. 数字 == 对象(对象数据类型) 对象先转成字符串,然后再转成数字;
4. 对象==对象 比较的是空间地址,空间地址不同,就false;
5. 对象==字符串 :对象转成字符串,然后进行比较
6. 对象==布尔 : 对象转字符串,字符串转数字,布尔直接转数字,然后进行比较;
7. 布尔==字符串 : 布尔值转数字 字符串转数字
8. null == undefined : true
9. NaN ==NaN false
数据类型检测
- typeof 检测数据类型的运算符
- instanceof 检测当前实例是否属于某个类
- constructor 基于构造函数检测数据类型(也是基于类的方式)
- Object.prototype.toString.call(): 检测数据类型最好的办法
typeof 检测数据类型的属性
- 他的返回值是一个字符串
- 字符串里存放的就是他的数据类型
- typeof null => ‘object’ 但是null并不是对象
- typeof检测数组、普通对象、null返回的都是’object’,所以用typeof检测数据类型,无法细分出是普通对象,是数组,是null
console.log(typeof 12) //'number'
console.log(typeof '12')//'string'
console.log(typeof undefined)//'undefined'
console.log(typeof null)//'object'
console.log(typeof true)//'Boolean'
console.log(typeof [])//'object'
console.log(typeof ({}))//'object'
// 只要两个及两个以上typeof,那最后的结果就是 'string'
console.log(typeof typeof typeof 12)//'string'
instanceof
- 他是检测当前实例是否属于某个类
- 实例 instanceof 类,如果实例是属于这个类,那就返回true,反之就是false
- 局限性
- instanceof不能检测基本数据类型,只能检测引用数据类型的值
- 非要检测基本数据类型,用构造函数创建变量,赋值为基本类型(new Number(11))
- instanceof不能检测基本数据类型,只能检测引用数据类型的值
function Fn(name, age){
this.name = name;
this.age = age;
}
let f1 = new Fn;
console.log(f1 instanceof Fn) // true
console.log(1 instanceof Fn) // false
console.log('22'.substr) // instanceof 不能够检测基本数据类型
console.log((1).substr) // instanceof 不能够检测基本数据类型
let num = new Number(11);
console.log(num instanceof Number)//true
constructor检测数据类型
- constructor 基于构造函数检测数据类型(也是基于类的方式)
- 不能把类的原型重定向
- 不能在实例的私有属性上加constructor
// function Fn() {
// }
// let f = new Fn;
// console.log(f.constructor === Fn)//true
// function Fn() {
// }
// Fn.prototype = {}
// let f = new Fn;
// console.log(f.constructor === Fn) //false
// f.constructor = 6;
// console.log(f.constructor) //6
Object.prototype.toString.call()
let ary =let ary = [1, 2];
let obj = {}
let num = 1
console.log(Object.prototype.toString.call(num))
//他的返回值是一个字符串,里边是 '[object 你当前实例的所属类]'
//只能检测内置类,不能检测自定义类(call(自定义类的实例)都是object)
function Fn(){};
let f =new Fn;