美文网首页
JS-1.数据类型

JS-1.数据类型

作者: 皇叔晨 | 来源:发表于2019-05-22 20:37 被阅读0次

JS分基本类型和引用类型(原始类型和对象类型、拥有方法的类型和不能拥有方法的类型、可变类型和不可变类型)。

数据类型 typeof
string string
number number
boolean boolean
undefined undefined
null object
function function
其他array,object,Set,Map等 object

1、基本类型

1.简单介绍

  • 基本数据类型有:null undefined number string boolean symbol

  • 基本类型的值是不可以变的,任何方法都无法改变一个基本类型的值。

    • 不能给基本类型添加属性和方法。
  • 基本类型的比较是值的比较。

  • 基本数据类型的访问是按值访问的,变量是存在栈区的(栈区指内存里的栈内存)。

    • 栈区包括了变量的标识符和变量的值。

2.简单赋值

在从一个变量向另一个变量赋值基本类型时,会在该变量上创建一个新值,然后再把该值复制到为新变量分配的位置上,实现深拷贝。

var a = 10;
var b = a;
​
a ++ ;
console.log(a); // 11
console.log(b); // 10
基本类型

也就是说基本类型在赋值操作之后,两个变量是相互不受影响的。

2、引用类型

对象是属性和方法的集合,属性又可以包括基本类型和类型,引用类型的值是按引用访问的。

1.引用类型的值是可变的。

可以为引用类型添加或者删除属性或者方法。

var obj = new Object();
obj.name = "chenchen";
obj.gender = "female";
console.log(obj.name);//chenchen
delete obj.name;
console.log(obj.name);//undefined

2.引用类型的值是同时保存在栈内存和堆内存中的对象。

javascript和其他语言不同,其不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间,引用类型的值是按引用访问的。

准确地说,引用类型的存储需要内存的栈区和堆区(堆区是指内存里的堆内存)共同完成,栈区内存保存变量标识符和指向堆内存中该对象的指针,也可以说是该对象在堆内存的地址。


引用类型

3.引用类型的比较是引用的比较

var person1 = '{}';
var person2 = '{}';
console.log(person1 == person2); // true
var person1 = {};
var person2 = {};
console.log(person1 == person2); // false

引用类型时按引用访问的,换句话说就是比较两个对象的堆内存中的地址是否相同,那很明显,person1和person2在堆内存中地址是不同的:


image

4.对象拷贝

当从一个变量向另一个变量赋值引用类型的值时,同样也会将存储在变量中的对象的值复制一份放到为新变量分配的空间中。前面讲引用类型的时候提到,保存在变量中的是对象在堆内存中的地址,所以,与简单赋值不同,这个值的副本实际上是一个指针,而这个指针指向存储在堆内存的一个对象。那么赋值操作后,两个变量都保存了同一个对象地址,则这两个变量指向了同一个对象。因此,改变其中任何一个变量,都会相互影响:


浅拷贝

因此,引用类型的赋值其实是对象保存在栈区地址指针的赋值,因此两个变量指向同一个对象,任何的操作都会相互影响。

3、基本数据类型转换

1.转换成string

1.a.toString()

不可以转换null和undefined

2.String(a)

都可以转换

3.隐式类型转换a+''

2.转换成number

1.Number(a)

null 0
undefined NaN
string-头部有数字 读取到数字部分
string-头部无数字 NaN
string-字符串空串或者全是空格 0
boolean 1/0

2.针对字符串parseInt(a)parseFloat(a)

对于非string则先转换成string

var a = "123.345b";
console.log(parseInt(a),parseFloat(a)) // 123 123.345

3.隐式转换a+0 a/1 a*1 a-0 +a

3.转换成Boolean

1.Boolean(a)

null false
undefined false
number 除了0和NaN是false,其他都是true
string 除了空串,其他都是false
object 也会转换成true

2.隐式类型转换!!a

4、js中的==和===

1.===

  • 首先判断类型是否相等,若相等则继续比较;
  • Number类型中,NaN不等于NaN,只能通过isNaN()来进行判定;
  • 其他类型遵循严格相等;
  • 引用类型则要指向同一个函数或者对象;

2.==

  • 若类型相等,则同===
  • null == undefined
  • numberstring进行比较,将string转换成number,在进行比较。
  • 若其中有Boolean,则转换成1或者0进行比较
  • 若对象和基本类型进行比较,把对象转换成基础类型的值在进行比较,使用toString()valueOf进行比较,Date使用的是toString()
  • 其他都不相等
var obj1 = {
  a : 'a',
  b : 'b'
};
console.log(obj1.toString()); //[object Object]
console.log(obj1.valueOf()); //{ a: 'a', b: 'b' }
console.log(obj1=='[object Object]');//true
console.log(obj1 == "{ a: 'a', b: 'b' }");//false
console.log(null == 0); //false
console.log(Number(null)); //0

var a={a:'a'};
console.log(a.toString(),a.valueOf());  //[object Object] Object {a: "a"}
console.log(obj1=='[object Object]');  //true
var p1=p2={};
console.log(p1==p2,p1===p2); //true true
var p2={};
console.log(p1==p2,p1===p2); //false false

//valueOf()返回值为该对象的原始值。
// Array:返回数组对象本身
var array = ["ABC", true, 12, -5];
console.log(array.valueOf() === array);   // true

// Date:当前时间距1970年1月1日午夜的毫秒数
var date = new Date(2013, 7, 18, 23, 11, 59, 230);
console.log(date.valueOf());   // 1376838719230

// Number:返回数字值
var num =  15.26540;
console.log(num.valueOf());   // 15.2654

// 布尔:返回布尔值true或false
var bool = true;
console.log(bool.valueOf() === bool);   // true

// new一个Boolean对象
var newBool = new Boolean(true);
// valueOf()返回的是true,两者的值相等
console.log(newBool.valueOf() == newBool);   // true
// 但是不全等,两者类型不相等,前者是boolean类型,后者是object类型
console.log(newBool.valueOf() === newBool);   // false

// Function:返回函数本身
function foo(){}
console.log( foo.valueOf() === foo );   // true
var foo2 =  new Function("x", "y", "return x + y;");
console.log( foo2.valueOf() );
/*
ƒ anonymous(x,y
) {
return x + y;
}
*/

// Object:返回对象本身
var obj = {name: "张三", age: 18};
console.log( obj.valueOf() === obj );   // true

// String:返回字符串值
var str = "http://www.xyz.com";
console.log( str.valueOf() === str );   // true

// new一个字符串对象
var str2 = new String("http://www.xyz.com");
// 两者的值相等,但不全等,因为类型不同,前者为string类型,后者为object类型
console.log( str2.valueOf() === str2 );   // false

参考:https://www.cnblogs.com/focusxxxxy/p/6390536.html

相关文章

  • JS-1.数据类型

    JS分基本类型和引用类型(原始类型和对象类型、拥有方法的类型和不能拥有方法的类型、可变类型和不可变类型)。 1、基...

  • JAVA 之路第一讲

    数据类型: 基础数据类型 包装器数据类型 引用数据类型 null 数据类型 基础数据类型: 整型 byte(字节型...

  • php 数据类型和数据类型转化

    一、数据类型 基础数据类型 复合数据类型 特殊数据类型 二、获取数据类型 三、打印数据类型和值 四、数据类型判断 ...

  • OC和C中的数据类型

    数据类型对比 C语言数据类型C语言数据类型 OC数据类型

  • JAVA 核心笔记 || [2] 数据类型

    JAVA数据类型分为两大数据类型: 1.内置数据类型2.引用数据类型 内置数据类型 引用数据类型 上篇 : 开篇 ...

  • 数据类型

    数据类型作用:数据类型不同,空间大小不同。 数据类型分类:基本数据类型、引用数据类型基本数据类型:整数型、浮点型、...

  • Java知识之数据类型

    Java数据类型图表## Java数据类型分为:### 基础数据类型 引用数据类型 null类型 基础数据类型分別...

  • JAVA基础第四天

    JAVA数据类型---布尔类型; 数据类型转换自动数据类型转换 强制数据类型转换

  • Java数据类型(慢慢积累,对于事物的理解也会不一样)

    Java的数据类型: 1. 内置数据类型(基本数据类型); 2. 引用数据类型; Java基本数据类型:(...

  • 【IOS 开发】 数据类型详解

    1. 数据类型简介及输出 (1) 数据类型简介 数据类型简介: Object - C 数据类型 分为 基本数据类型...

网友评论

      本文标题:JS-1.数据类型

      本文链接:https://www.haomeiwen.com/subject/tmquoqtx.html