js数据类型(基本数据类型引⽤数据类型)
⼀、数据类型
JS分两种数据类型:
基本数据类型:**Number、String、Boolean、Null、 Undefined、Symbol(ES6),**这些类型可以直接操作保存在变量中的实际值。
引⽤数据类型:Object(在JS中除了基本数据类型以外的都是对象,数据是对象,函数是对象,正则表达式是对象)
1、基本数据类型(六种)存放在栈中
基本数据类型是指存放在栈中的简单数据段,数据⼤⼩确定,内存空间⼤⼩可以分配,它们是直接按值存放的,所以可以直接按值访问
1、Number数值类型
Number类型包含整数和浮点数(浮点数数值必须包含⼀个⼩数点,且⼩数点后⾯⾄少有⼀个数字)两种值
注意:在js中浮点数的精度是17位,计算是⼆进制的计算数 据,所以得到的不是整数
var num1 =0.1;
var num2 =0.2;
console.log(num1 + num2);//0.30000000000000004
NaN:⾮数字类型,属于数值型基本数据类型
特点:
1):设计任何的NaN操纵都会返回NaN
console.log('ab'/10); // NaN
2) NaN不等于⾃⾝。
console.log(NaN == NaN);// false;
判断是否是Number类型
1、isNaN:判断是否是⼀个⾮数字类型,传⼊的⾮数字类型,返回true,否则返回false
注意:传⼊的参数⾸先会被转化为数值,如果参数类型为对象类型,先调⽤valueOf()⽅法,再确定该⽅法返回的值是否可以转换为数值类型,如果不能,再调⽤toString()⽅法,再确定返回值
2、typeof
console.log(typeof 12) //Number
数值类型的转换:
Number():可以⽤于任何的数据类型
parseInt:提取 整数数值
paseFloat:提取浮点数值
2、String 字符串类型
特点:
1、字符串的单引号和双引号作⽤效果⼀样
2、字符串有length属性,可以取得字符串的长度
3、字符串的值是不可变的,所以很多的字符串的api不会改变原字符串值
字符串转换:
String():适⽤于任何的数据类型(null -> null undefined -> undefined)
toString():null和undefined没有这个功能
console.String()); //error 报错
3、Boolean 布尔类型
该类型只有两个值:true、false
转换为`boolean`:`Boolean()`
Boolean(undefined):false
Boolean(null):false
Boolean(⾮空对象包括空数组[]和空对象{}):true
Boolean(⾮0):true||Boolean(0和NaN):false
Boolean(⾮空包括空格字符串):true||Boolean(''):false
[注意]true不⼀定等于1,false也不⼀定等于0
出现场景:
(1)条件语句导致执⾏的隐⼠类转换
(2)字⾯量或变量定义
类型转换:
Number(true):1    ||  Number(false):0
String(true):'true'   ||  String(false):'false'
4、Null 空对象指针类型
如果定了⼀个对象,初始化可以为null,因为null的基本类型是Null,在if语句中默认转化为false,在和数值计算默认为0出现场景:对象不存在
类型转换:
Booleam(null)false
Number(num)0
String(null)'null'
Number(null) // 0
5、Undefined
申明了变量但是没有初始化,默认为undefined,在if语句中默认转化为false,
undefined:表⽰‘缺少值’,就是应该有⼀个值,但是没有定义,以下⽤法是典型的出现undefined情况
js正则表达式判断数字(1)变量被申明,等于undefined
(2)调⽤函数时,应该提供的参数没有提供,该参数等于undefined
(3)对象没有赋值的属性,该属性值为undefined
(4)函数没有返回值,默认返回undefined
类型转换:
Boolean(undefined): false
Number(undefined): NaN
String(undefined):  'undefined'
6、Symbol
ES6新增的⼀个基本数据类型,表⽰唯⼀性
let id1 =Symbol('id');
let id2 =Symbol('id');
console.log(id1 == id2);//false
Symbol属性类型不⽀持in和Object.keys()
let id =Symbol("id");
let obj ={
[id]:'symbol'
};
for(let option in obj){
console.log(obj[option]);//空
}
但是也能有⽅法去访问:OwnPropertySymbols
⽅法会返回⼀个数组,成员是当前对象的所有⽤作属性名的 Symbol 值。
console.OwnPropertySymbols(obj))
/
/ [ Symbol(c) ]
介绍两个Symbol.for 和 Symbol.keyFor
(1)、Symbol.for :⽅法根据给到的键key来运⾏时的symbol注册表中到对应的symbol,如果到了,则返回它,否则新增⼀个与该键
关联的symbol,并放⼊全局的symbol,这个Symbol值可以是被⼆次⽤到的
返回值:
返回由给定的 key 到的 symbol,否则就是返回新创建的 symbol。
Symbol.for("foo");// 创建⼀个 symbol 并放⼊ symbol 注册表中,键为 "foo"
Symbol.for("foo");// 从 symbol 注册表中读取键为"foo"的 symbol
Symbol.for("bar")=== Symbol.for("bar");// true,证明了上⾯说的
Symbol("bar")===Symbol("bar");// false,Symbol() 函数每次都会返回新的⼀个 symbol
为了防⽌冲突,最好给你要放⼊ symbol 注册表中的 symbol 带上键前缀。
Symbol.for("mdn.foo");
Symbol.for("mdn.bar");
(2)、Symbol.keyFor
⽅法⽤来获取 symbol 注册表中与某个 symbol 关联的键。
var globalSym = Symbol.for("foo");
Symbol.keyFor(globalSym);// "foo"
2、引⽤数据类型
引⽤数据类型也叫对象数据类型,包括function,object,array,date,RegExp等可以可以使⽤new创建的数据,⼜叫对象类型,他们是存放在堆(heap)内存中的数据
特点:
引⽤类型的值可以改变
引⽤数据类型可以添加属性和⽅法
引⽤数据类型的赋值是对象引⽤
引⽤类型的⽐较是引⽤的⽐较
引⽤类型是同时保存在栈区中和堆区中的,引⽤类型的存储需要在内存的栈区和堆区中共同完成,栈区保存变量标识符和指向堆内存的地址
注意:在引⽤类型赋值时对象的引⽤,所以从⼀个变量向另⼀个变量赋值引⽤类型的值时,同样会将存在在变量中的对象的值赋值⼀份到新的变量分配的空间,引⽤类型保存在变量中的时对象在堆存在的地址,所以与基本数据类型的简单赋值不同,这个值的副本实际上时⼀个指针,⽽这个指针指向储存在堆内存的⼀个对象,那么赋值操作后,两个变量都保存了同⼀个对象的地址,⽽这个地址都指向同⼀个对象,因此改变其中任何⼀个变量,都会影响
在ECMAScript中,Object类型是所有它的实例的基础
Object的每个实例都具有下列的属性和⽅法:
constructor:构造函数
hasOwnProperty(proertyName)
⽤于检查给定的属性在当前对象实例(⽽不是实例的原型)中是否存在。
isPropertyOf(Object)
⽤于检查其原型链的对象是否存在于指定对象的实例中,是则返回true,否则返回false。
var a ={}function Person(){}
var p1 =new Person()// 继承⾃原来的原型,但现在已经⽆法访问
var Person.prototype = a var p2 =new Person()// 继承a
console.log(a.isPrototypeOf(p1))// false a是不是p1的原型
console.log(a.isPrototypeOf(p2))// true a是不是p2的原型
console.log(Object.prototype.isPrototypeOf(p1))// true
console.log(Object.prototype.isPrototypeOf(p2))// true
propertyIsEnumerable(propertyName)
⽤于检查给定的属性是否可以⽤ for-in 语句进⾏枚举。
toLocaleString()
返回对象的字符串表⽰,该字符串与执⾏环境的地区对应。
toString()
返回对象的字符串表⽰。
valueOf()
返回对象的字符串、数值、布尔值表⽰。通常与toString()⽅法的返回值相同。
拓展:声明对象的⼏种⽅式

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。