Open felix-cao opened 6 years ago
本篇主要聊七中基本类型:
null 和 undefined 的区别请参考 undefined与null的区别
null
undefined
基本数据类型不能再细分了,基本类型的数据类型有以下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 在调用字符串函数 toLowerCase 和 substring 后并未发生改变。toLowerCase 和 substring 返回的都是一个新的字符串。
blog
toLowerCase
substring
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 了。 这是当比较的两个值的类型不同的时候 == 运算符会进行隐式类型转换,因此在做比较运算时,即使两个值和类型都相同,也强烈建议使用 ===。
Implicit Type Conversion
==
a
true
b
===
栈区指内存中的栈内存,假如有以下几个基本类型的变量:
var name = 'Felix'; var isStudent = true; var age = 32;
那么它的存储结构如下图:
栈区包括了变量的标识符和变量的值。
编程语言按照变量数据类型可以分为_动态类型_和静态类型,动态类型是指程序在运行时,变量被赋予某个值后才确定的数据类型,而静态类型是指编译时就确定了变量的数据类型。
很显然 JavaScript 是动态类型,那么我们如何去检测变量的类型呢?
JavaScript
JavaScript 提供了 typeof 运算符,用来检测一个变量的数据类型。
typeof
基本数据类型的数据类型检测使用 typeof() 函数,除 null,null 有属于自己的数据类型 Null 。
typeof()
Null
typeof ''; // "string" typeof 1; // "number" typeof true; // "boolean" typeof undefined; // "undefined" typeof null; // "object"
ES6 新增的 Symbol()
ES6
Symbol()
typeof Symbol(); // "symbol"
function
object
typeof [] ; // object typeof new Function(); // function typeof new Date(); // object typeof new RegExp(); // object
本篇主要聊七中基本类型:
null
和undefined
的区别请参考 undefined与null的区别基本数据类型不能再细分了,基本类型的数据类型有以下4个特点:
一、值不可变
任何方法都无法改变一个基本类型的值,比如一个字符串:
上面的代码,我们可以看到
blog
在调用字符串函数toLowerCase
和substring
后并未发生改变。toLowerCase
和substring
返回的都是一个新的字符串。通过上面的代码可知,我们不能给基本类型的数据添加属性和方法,再次说明基本类型的数据是不可变的。
二、值的比较
如下代码
这里其实这是隐式类型转换(
Implicit Type Conversion
)和==
运算符的知识了,也就是说在用==
比较两个不同类型的变量时会进行一些隐式类型转换。像上面的比较先会把a
的数字 1 转换为true
再和数字b
进行比较,结果就是true
了。 这是当比较的两个值的类型不同的时候==
运算符会进行隐式类型转换,因此在做比较运算时,即使两个值和类型都相同,也强烈建议使用===
。三、存放在栈区的
栈区指内存中的栈内存,假如有以下几个基本类型的变量:
那么它的存储结构如下图:
栈区包括了变量的标识符和变量的值。
四、 typeof 操作符检测
编程语言按照变量数据类型可以分为_动态类型_和静态类型,动态类型是指程序在运行时,变量被赋予某个值后才确定的数据类型,而静态类型是指编译时就确定了变量的数据类型。
很显然
JavaScript
是动态类型,那么我们如何去检测变量的类型呢?JavaScript
提供了typeof
运算符,用来检测一个变量的数据类型。4.1、基本数据类型的6种(含ES6)
基本数据类型的数据类型检测使用
typeof()
函数,除null
,null
有属于自己的数据类型Null
。ES6
新增的Symbol()
4.2、引用类型的2种
function
返回function
类型。function
以外,一律返回object
类型。Reference