ECMAScript不支持任何创建自定义类型的机制
所有值都是: 7种原始类型 + 引用类型Object = 8种数据类型之一。
有7种
(只有null值)
null值表示一个空对象指针,所以typeof会返回Object
null == undefined // true ,undefined派生自null
(只有undefined值)
包含undefined值的变量与尚未定义的变量是不一样的:
var mes;
mes //undefined
age //没有声明,报错
对未初始化和未声明的变量执行typeof都返回undefined
(只有true false值)
可以对任何数据类型的值调用Boolean()函数,而且总会返回一个Boolean值
返回true或者false取决于要转换值的数据类型以及其值
规则:
数据类型 转换为true的值 转换为false的值
�Boolean true false
String 任何非空字符串 ""(空字符串)
Numbber 任何非0数字值(包括无穷大) 0和NaN
Object 任何对象
undefined undefined
流控制语句(如if语句)自动执行相应的Boolean转换
具体见 String文档
用来表示整数和浮点数值
具体见 number文档
typeof 42n; // → 'bigint'
复杂数据类型 : 指的是 Object 类型,所有其他的如 Array、Date 等数据类型都可以理解为 Object 类型的子类。
10个引用类型
1. Object
js中的对象其实就是一组数据和功能的集合。
对象可以通过new操作符后跟要创建的对象类型的名称来创建。
在js中,Object类型是所有它的实例的基础。Object所具有的任何属性和方法也同样存在与更具体的对象中。
Object的每个实例都具有以下属性和方法:
- Constructor: 保存着用于创建当前对象的函数。
- hasOwnProperty(proertyName)
- isPrototypeOf(object) : 传入的对象是否是另一个对象的原型。
- propertyIsEnumerable(proertyName)
- toLocalString()
- toString()
- valueOf()
2. Function
3. Array
4. Date
5. RegExp
每当读取一个基本类型的值的时候,后台就会创建一个对应的包装类型的对象:
// Boolean Number String 都适用于以下
var s1 = 'abc';
var s2 = s1.substring(2);
//当第二行访问s1的时候,开始等价执行以下代码:
var s1 = new String('abc');
var s2 = s1.substring(2);
s1 = null;
6. Boolean
Boolean类型与布尔值对应的引用类型
创建Boolean对象:调用Boolean构造函数并传入true或false值
var booleanObject = new Boolean(true);
Boolean类型的实例重写了valueOf()方法,返回基本类型值true或者false
重写了toString()方法,返回字符串'true'或'false'
布尔表达式中的所有对象都会被转换为true,如下:
var falseObject = new Boolean(false);
falseObject && true // true
var falseValue = false;
falseValue && true // false
基本类型与引用类型的布尔值还有两个区别,如下:
typeof falseObject // object
typeof falseValue // boolean
falseObject instanceof Boolean // true
falseValue instanceof Boolean // false
7. Number
具体见 Number文档
8. String
具体见 String文档
9. Global对象
10. Math对象
主要区别是对象的生存周期。
使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中。
而自动创建的基本包装类型的对象,则只存在于一行代码的执行瞬间,然后立即被销毁。
根据传入值的类型返回相应基本包装类型的实例
var obj = new Object('aa');
console.log(obj instanceof String);// true
var value = '25';
var number = Number(value); //转型函数
alert(typeof number); // 'number',保存的是基本类型的值25
var obj = new Number(value); //构造函数
alert(typeof obj); // 'object',保存的是Number的实例
https://juejin.im/post/6844903997615128583
堆和栈的概念存在于数据结构中和操作系统内存中。
原始数据类型直接存储在栈(stack)中的简单数据段,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储。
由操作系统自动分配释放 ,存放函数的参数值和局部变量的值等。
栈的特点是先进后出(或后进先出)
除了局部变量,其他的全都存在堆中
引用数据类型存储在堆(heap)中的对象,占据空间大、大小不固定。如果存储在栈中,将会影响程序运行的性能;引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。
对于对象类型,在栈中存的只是一个堆内地址的引用。
一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,
分配方式倒是类似于链表
undefined 代表的含义是未定义,null 代表的含义是空对象。
一般变量声明了但还没有定义的时候会返回 undefined,
null主要用于赋值给一些可能会返回对象的变量,作为初始化。
null == undefined // true
null === undefined // false
typeof(null) // object
typeof : 先做基本类型检测,再对null和其他Object用Object内部属性toString检测
typeof检测结果: 7种。undefined、object、boolean、number、string、object, symbol
//常规检测
var arr=[1,'a'];
Array.isArray(arr);
arr instanceof Array;
// 数字检测另外一种方式
typeof value === 'number' && !isNaN(value);
Object.prototype.toString : 可以检测至少14种object:
// 以下是11种:
var number = 1; // [object Number]
var string = '123'; // [object String]
var boolean = true; // [object Boolean]
var und = undefined; // [object Undefined]
var nul = null; // [object Null]
var obj = {a: 1} // [object Object]
var array = [1, 2, 3]; // [object Array]
var date = new Date(); // [object Date]
var error = new Error(); // [object Error]
var reg = /a/g; // [object RegExp]
var func = function a(){}; // [object Function]
console.log(Object.prototype.toString.call(Math)); // [object Math]
console.log(Object.prototype.toString.call(JSON)); // [object JSON]
检测类型的方法封装:
function getType(value) {
// 判断数据是 null 的情况
if (value === null) {
return value + "";
}
// 判断数据是引用类型的情况
if (typeof value === "object") {
let valueClass = Object.prototype.toString.call(value),
type = valueClass.split(" ")[1].split("");
type.pop();
return type.join("").toLowerCase();
} else {
// 判断数据是基本数据类型的情况和函数的情况
return typeof value;
}
}
typeof检测给定变量的数据类型
typeof是一个操作符而不是函数,可以不用括号
typeof对基本类型返回基本类型,对引用类型返回"object"
typeof 可以检测所有类型值,除了一个特殊情况: null返回的是object
返回值:
'undefined'
'Object'
'boolean'
'string'
'number'
'function'
'symbol'
typeof 37 // 'number';
typeof Infinity // 'number';
typeof NaN // 'number' 尽管NaN是"Not-A-Number"的缩写
typeof "" // 'string'
typeof "bla" // 'string'
typeof true // 'boolean'
typeof Symbol() // 'symbol'
typeof undefined // 'undefined'
typeof null // 'object'
// object
typeof {a:1} === 'object';
typeof [1, 2, 4] === 'object';
typeof new Date() === 'object';
// 函数
typeof function(){} === 'function';
// 检测原型
(1) if (..) 语句中的条件判断表达式。 (2) for ( .. ; .. ; .. ) 语句中的条件判断表达式(第二个)。 (3) while (..) 和 do..while(..) 循环中的条件判断表达式。 (4) ? : 中的条件判断表达式。 (5) 逻辑运算符 ||(逻辑或)和 &&(逻辑与)左边的操作数(作为条件判断表达式)。
类型转换可以分为两种:🌛隐式类型转换和☀️显式类型转换。
隐式类型转换是指在对不同类型的值使用运算符时,值可以在类型之间自动的转换,比如 1 == null。
我们需要知道的是:在 JS 中只有 3 种类型的转换
转化为 Number 类型:Number() / parseFloat() / parseInt()
转化为 String 类型:String() / toString()
转化为 Boolean 类型: Boolean()
- 转换为boolean
通常在逻辑判断或者有逻辑运算符时被触发(|| && !)。
- 转换为string
通常在有 + 运算符并且有一个操作数是 string 类型时被触发。
- 转换为number
number 的隐式类型转换是比较复杂的,因为它可以在下面多种情况下被触发。
比较操作(>, <, <=, >=) 按位操作(| & ^ ~) 算数操作(- + * / %), 注意:当 + 操作存在任意的操作数是 string 类型时,不会触发 number 类型的隐式转换 一元 + 操作
如果两边数据类型不同,需要先转为相同类型,然后再进行比较
对象==字符串: 将对象转换为字符串
对象==对象: 比较的是堆内存地址,地址相同则相等