深入学习JavaScript数据类型

前端开发 作者: 2024-08-22 23:05:01
数据类型是我们学习JavaScript时最先接触的东西,它是JavaScript中最基础的知识,这些知识看似简单,但实则有着许多初学者甚至是部分学习了多年JavaScript的老手所不了解的知识。
  • Null:只包含一个值:null
  • Undefined:只包含一个值:undefined
  • Boolean:包含truefalse
  • Number:整数或浮点数,还有一些特殊值(-Infinity+InfinityNaN
  • String:字符串
  • Symbol:表示独一无二的值(ES6加入)
  • Object对象:包含对象、数组、函数等。

存放位置不同

  • 存储的值大小固定
  • 空间较小
  • 可以直接操作,效率高
  • 存储的值大小不确定,可以动态调整
  • 空间较大,运行效率低
  • 无法直接操作其内部,使用引用地址读取
var a = 10;
var b = 'hello';
var c = true;
var a = 10;
var obj1 = { name: 'nihao' };
var obj2 = function () {
    // do something
}

基本类型具有不可变性

var name = 'hello';
name.toUpperCase(); // "HELLO"
console.log(name); // "hello"
var c = true;
c = false;
console.log(c); // false
var obj1 = { name: 'nihao' };
obj1.name = 'nibuhao';
console.log(obj1); // { name: 'nibuhao' }

值比较和引用比较

var str1 = 'Hello';
var str2 = 'Hello';
console.log(str1 === str2); // true
var obj1 = { name: 'obj' };
var obj2 = { name: 'obj' };
console.log(obj1 === obj2); // false

赋值

var str1 = 'Hello';
var str2 = str1;
str2 = 'World';
console.log(str1); // "Hello"
//str1的值没变
var obj1 = { name: 'obj1' };
var obj2 = obj1;
obj2.name = 'obj2';
console.log(obj1.name); // "obj2"
// obj1的值改变
  • null表示空值
  • undefined表示“缺少值”,即此处应该有值,但是还未定义
var a = null;
console.log(typeof a); // object
console.log(typeof b); // undefined
var s = Symbol(); // 注意没有new
var name1 = Symbol('Tom');
var name2 = Symbol('Tom');
console.log(name1 === name2); // false
var name1 = Symbol.for('Tom');
var name2 = Symbol.for('Tom');
console.log(name1 === name2); // true
var obj = {
    [Symbol('name')]: 'Tom'
};
var obj = {
    [Symbol('name')]: 'Tom'
};
for (var key in obj) {
   console.log(key); // undefined
}
Object.getOwnPropertySymbols(obj); // [Symbol(name)]

宽松等号(==)的隐式转换

NaN

NaN == NaN // false

Boolean类型与其他类型进行比较

false == 0 // true
true == 1 // true
true == 2 // false
var x = 10;
if (x) {
	// ...
}
if (x == true) {
    // ...
}

Number类型和String类型进行比较

'' == 0 // true
'123' == 123 // true
'1e11' == 1e11 // true
Infinity == 'Infinity' // true
true == '1' // true
false == '0' // true

null与undefined

基本类型与引用类型比较

  • 当引用类型需要被转为基本类型时,它会先查找对象的valueOf方法,如果该方法返回基本类型的值,则ToPrimitive的结果就是这个值
  • 如果valueOf不存在或者valueOf方法返回的不是基本类型,就会尝试调用对象的toString方法,然后使用toString的返回值作为ToPrimitive的结果
  • valueOftoString都不存在,或者没有返回基本类型,则抛出TypeError异常
Number([]); // 0
Number([10]); // 10

var obj = {
    valueOf: () => { return 10; },toString: () => { return -10; }
};
Number(obj); // 10
String(obj); // -10
var a = {};
var b = [1,2,3];

a == '[object Object]'; // true
a.toString(); // [object Object]
b == '1,3' // true
b.toString(); // "1,3"

typeof

typeof 'str';  // string
typeof 123;  // number
typeof true;  // boolean
typeof Symbol();  // symbol
typeof undefined;  // undefined
typeof function () {} // function

instanceof

[] instanceof Array; // true
/1/ instanceof RegExp; // true
new Date() instanceof Date; // true
null instanceof null; // Uncaught TypeError: Right-hand side of 'instanceof' is not an object
null instanceof Object; // false

Object.prototype.toString.call()

Object.prototype.toString.call(null); // [object Null]
Object.prototype.toString.call(undefined); // [object Undefined]
Object.prototype.toString.call(123); // [object Number]
Object.prototype.toString.call(new Date()); // [object Date]
// ...
function Person() {}
Object.prototype.toString.call(new Person()); // [object Object]
new Person() instanceof Person; // true
原创声明
本站部分文章基于互联网的整理,我们会把真正“有用/优质”的文章整理提供给各位开发者。本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
本文链接:http://www.jiecseo.com/news/show_66920.html