felix-cao / Blog

A little progress a day makes you a big success!
31 stars 4 forks source link

JavaScript 基本数据类型(Primitive Values) #42

Open felix-cao opened 6 years ago

felix-cao commented 6 years ago

本篇主要聊七中基本类型:

nullundefined 的区别请参考 undefined与null的区别

基本数据类型不能再细分了,基本类型的数据类型有以下4个特点:

一、值不可变

任何方法都无法改变一个基本类型的值,比如一个字符串:

var blog = 'Felix';
var blogLower = blog. toLowerCase(); // toLowerCase 函数返回一个新字符串
console.log(blogLower) // 'felix'
console.log(blog); //  'Felix'

var blogSub = blog.substring(0, 3); // substring 函数返回一个新字符串
console.log(blogSub); // 'Fel'
console.log(blog); // 'Felix'

上面的代码,我们可以看到 blog 在调用字符串函数 toLowerCasesubstring 后并未发生改变。toLowerCasesubstring 返回的都是一个新的字符串。

var user = 'Felix';
user.age = 32;
user.getName = function(){//...};

console.log(user.age); // undefined
console.log(user.getName); // undefined

通过上面的代码可知,我们不能给基本类型的数据添加属性和方法,再次说明基本类型的数据是不可变的。

二、值的比较

如下代码

var a = 1;
var b = true;
console.log(a == b); // true

这里其实这是隐式类型转换(Implicit Type Conversion)和 == 运算符的知识了,也就是说在用 == 比较两个不同类型的变量时会进行一些隐式类型转换。像上面的比较先会把 a 的数字 1 转换为 true 再和数字 b 进行比较,结果就是 true 了。 这是当比较的两个值的类型不同的时候 == 运算符会进行隐式类型转换,因此在做比较运算时,即使两个值和类型都相同,也强烈建议使用 ===

三、存放在栈区的

栈区指内存中的栈内存,假如有以下几个基本类型的变量:

var name = 'Felix';
var isStudent = true;
var age = 32;

那么它的存储结构如下图:

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

四、 typeof 操作符检测

编程语言按照变量数据类型可以分为_动态类型_和静态类型,动态类型是指程序在运行时,变量被赋予某个值后才确定的数据类型,而静态类型是指编译时就确定了变量的数据类型。

很显然 JavaScript 是动态类型,那么我们如何去检测变量的类型呢?

JavaScript 提供了 typeof 运算符,用来检测一个变量的数据类型。

4.1、基本数据类型的6种(含ES6)

基本数据类型的数据类型检测使用 typeof() 函数,除 nullnull 有属于自己的数据类型 Null

typeof ''; // "string"
typeof 1; // "number"
typeof true; // "boolean"
typeof undefined; // "undefined"
typeof null; // "object"

ES6 新增的 Symbol()

typeof Symbol(); // "symbol"

4.2、引用类型的2种

typeof [] ; // object
typeof new Function(); // function
typeof new Date(); // object
typeof new RegExp(); // object

Reference