新手浅谈JS之6种数据类型

419 阅读6分钟

如果你想要掌握一门高级的计算机编程语言,那么这门语言的数据类型你就必须非常熟悉了。下面就让我这个刚刚开始学习JavaScript这门语言的新手,对JS中的6种数据类型作一个简单的介绍。其中,String(字符串)、Number(数值)、Boolean(布尔值)、Null(空值)和Undefined(未定义)属于基本数据类型,Object属于引用数据类型。由于是新手,如果有不足之处,请多多包涵!

String

  • 在JS中使用字符串需要使用引号引起来
let str = "Hello World!";
console.log(str); //输出Hello World

此时的str是一个变量,如果我们在输出的时候加了引号,输出的就是"str"字符串了。

let str = "Hello World!";
console.log("str");

  • 在JS中使用单引号或双引号都可以,但尽量不要混着用
let str = 'Hello World!';
console.log(str);

let str = 'Hello World!";
console.log(str);

  • 引号不要嵌套使用,即在单引号里面使用单引号,在双引号里面使用双引号
let str = ''今天,我要出去玩'';
console.log(str);

这种情况是会报错的。但是,在最外层使用单引号,在里层使用双引号是可以的,反之亦然。

let str = '"今天,我要出去玩"';
console.log(str);

let str = "'今天,我要出去玩'";
console.log(str);

Number

  • 在JS中所有的数值都是Number类型,包括浮点数(小数)和整数
  • 在JS中能表示的最大值为Number.MAX_VALUE(1.7976931348623157e+308)
  • 最小值为Number.MIN_VALUE(5e-324),它表示大于0的最小值
  • 如果使用Number表示的数字超过了最大值,则会返回Infinity,它表示正无穷,相反数表示负无穷
  • NaN 是一个特殊的数字,表示Not A Number(一个不能产生正常结果的运算结果)。NaN不等于任何值,包括它自己。我们可以用isNaN(number)来检测NaN
  • 在JS中整数的运算基本可以保证精确,但浮点数的计算可能会得到一个不精确的数字。所以不要用JS进行对精确度要求较高的运算
let a = "eee" * "eee";
console.log(a);

Null

Null类型的值只有一个,就是null。null这个值专门用来表示一个为空的对象

Undefined

Undefined类型的值同样也只有一个,就是undefined。当我们声明一个变量但是不给它赋值时,此时的类型就是undefined类型。但要注意的是var和let的不同。var命令会发生“变量提升”现象,即变量可以在声明之前使用,值为undefined。这种现象多多少少是有些奇怪的,按照一般的逻辑,变量应该在声明语句之后才可以使用。为了纠正这种现象,let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错。

console.log(a);
var a = 3;//undefined

console.log(a);
let a = 3;//ReferenceError

Boolean

布尔值相对来说比较简单,它只有两个值:true和false。true表示逻辑上的真,false表示逻辑上的假。 false,null,undefined,空字符串,数字0和数字NaN的值都为假。其他所有的值都被当做真,包括true、字符串“false”,以及所有的对象。

Object

除了以上提到的5中数据类型,剩下的都可以看做是object对象类型,比较常见的有数组、函数、正则表达式等。当然,对象自然也是对象,这里就不阐述得那么详细了。

补充

  1. 我们可以用typeof 来检测变量的类型
let a = "fff";
let b = 'fff';
console.log(typeof a);
console.log(typeof b);

let c = NaN;
let d = Infinity;
console.log(typeof c);
console.log(typeof d);

let e = null;
let f = '';
console.log(typeof e);
console.log(typeof f);

let g = undefined;
console.log(typeof g);

let h = []
console.log(typeof h);

2.辨析"=="和"==="

  • 相等(“==”)运算符用来比较两个值是否相等。如果相等,则会返回true,如果不等,返回false
console.log(1 == 1);// true
console.log(1 == 10);// false
  • 当使用相等运算符比较两个值时,如果两个值的类型不同,JS则会自动进行类型转换,将两个值转换为相同的数据类型再进行相等运算
console.log(1 == "1"); // true
console.log(true == "1"); // true
console.log(null == 0); // false null未转换为number0
  • undefined衍生自null,所以这两个值作相等运算时会返回true
console.log(undefined == null)

  • NaN不和任何值相等,包括它自己本身
console.log(NaN == 1);
console.log(NaN == "1");
console.log(NaN == NaN);

  • 全等(“===”)运算符和相等(“==”)运算符类似,但不同的是全等运算符不会自动进行类型转换,当两个值的类型不相等时,直接返回false
console.log( 1 == "1");
console.log( 1 === "1");
console.log( null == undefined);
console.log( null === undefined);

  1. 基本数据类型和引用数据类型的区别
  • 基本数据类型中的值是独立的,多个值之间互不关联,一个变量的改变不会影响另一个变量的改变
let a = 1;
let b = a;
a += 1;
console.log("a= " + a);
console.log("b= " + b);

  • 对象是保存到堆内存中的,每创建一个对象,就会在堆内存中开辟出一块新的空间,而对象保存的是内存空间的地址(对象的引用)。如果两个变量保存的是同一个对象的引用,那么当一个通过一个变量修改属性时,另一个也会受到影响
let obj1 = new Object();
obj1.name = "小明";
let obj2 = obj1;
obj1.name = "小江";
console.log(obj1.name);
console.log(obj2.name);

那么为什么会这样呢?这就涉及到了变量和值在内存中的存储了。 在JS中,变量都是存储在栈内存中的。基本数据类型的值直接存储在栈内存里面。

当我们声明一个变量a并同时把1赋给a时,计算机就会把a和它的值1存储在栈内存中。接着,我们又创建了一个变量b,并且把a赋给b,此时,计算机会把a的值复制一份和b一起存储到栈内存中。要注意的是,此a和b的值已经是独立的了,没有关系了。当a自增1时,a的值变成了2,但b的值因为和a的值是独立的,b的值就不会改变了。所以最后的结果就是a = 2,b = 1了。

在JS中,对象是存储在堆内存中的。当我们创建一个对象时,系统会在堆内存中开辟出一块新的空间专门来存储这个对象。变量obj1是保存在栈内存中的,那么变量和对象怎么联系在一起呢?我们知道这块新空间是在内存中开辟的,那它肯定有它的地址。这个时候变量obj1保存的就是这块空间的首地址0x111(假设的,并非实际地址),变量通过地址来操作对象。此时就相当于有一个指针指向了对象。现在,我们往obj1中添加name属性,属性值为“小明”,我们不是往变量obj1中添加而是往变量保存的地址指向的对象中添加。接着,我们又创建了一个变量obj2,将其保存到栈内存中,要注意的是我们并没有创建一个新的对象,只是把obj1赋值给了obj2。这个时候两个变量保存的是同一个地址,两个变量操作的是同一个对象。最后,我们把obj1中的属性值修改为“小江”,对象的属性值变成了“小江”。由于obj1,obj2指向的地址一样,所以它们的属性值也同时变为了“小江”。