### JavaScript的八种数据类型
原始值五种:Number,String,Boolean,Null,undefined
引用值:Object(包含Array,Function,Date)
检查变量类型的方法
(1)typeof
主要用于判断数据是不是原始值:String、Number、Object、Null、Undefined,但是无法判断出function(有些浏览器会出错)、array、regExp
console.log(typeof '');//string
console.log(typeof []);//object
console.log(typeof {});//object
console.log(typeof 1);//number
console.log(typeof null);//object
console.log(typeof undefined);//undefined
console.log(typeof true);//boolean
console.log(typeof function(){});//function
console.log(typeof /\d/);//object
typeof的返回值共有七种:
number, boolean, string, undefined, object, function,symbol.
1、number
typeof(10);
typeof(NaN);
//NaN在JavaScript中代表的是特殊非数字值,它本身是一个数字类型。
typeof(Infinity);
2、boolean
typeof(true);
typeof(false);
3、string
typeof("abc");
4、undefined
typeof(undefined);
typeof(a);//不存在的变量
5、object
对象,数组,null返回object
typeof(null);
typeof(window);
6、function
typeof(Array);
typeof(Date);
7、symbol
typeof Symbol() // ES6提供的新的类型
(2)instanceof
主要的目的是用来检测引用值,判断Array和RegExp,无法准确判断Function
console.log([] instanceof Array);//true
console.log({} instanceof Object);//true
console.log(/\d/ instanceof RegExp);//true
console.log(function(){} instanceof Object);//true
console.log(function(){} instanceof Function);//true
console.log('' instanceof String);//false
console.log(1 instanceof Number);//false
(3)Object.prototype.toString
折是对象的一个原生原型扩展函数,用来精确的区分数据类型
var type=Object.prototype.toString
console.log(type.call(''));//object String
console.log(type.call([]));//object Array
console.log(type.call({}));//object Object
console.log(type.call(false));//object Boolean
console.log(type.call(null));//object Null
console.log(type.call(undefined));//object Undefined
console.log(type.call(function(){}));//object Function
判断方式
console.log(type.call('')=="[object String]");//true
ES6提供的新类型symbol
作为JavaScript的第六种原始值
为什么要用symbol?
ES5的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin模式),新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是ES6引入Symbol的原因。
用法
var mySymbol = Symbol();
// 第一种写法
var a = {};
a[mySymbol] = 'Hello!';
// 第二种写法
var a = {
[mySymbol]: 'Hello!'
};
// 第三种写法
var a = {};
Object.defineProperty(a, mySymbol, { value: 'Hello!' });
// 以上写法都得到同样结果
a[mySymbol] // "Hello!"
//mySymbol就是你要添加的属性名但是又怕起冲突的名字 看一眼代码是不是觉得很简单啦
有哪些注意事项?
Symbol函数前不能使用new命令因为它是一条单身狗 没有对象的它是一种类似于字符串的数据类型。
Symbol值不能与其他类型的值进行运算,会报错,但是可以显示的转换为字符串以及转换为布尔值
Symbol 作为属性名,该属性不会出现在for…in、for…of循环中,也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回。但是,它也不是私有属性,有一个Object.getOwnPropertySymbols方法,可以获取指定对象的所有 Symbol属性名。
其他类型转成字符串: toString()
toLocaleString 方法
通俗的说就是转成想要的各种语言环境形式
用于返回格式化对象后的字符串,该字符串格式因不同语言而不同。可以通过传参决定返回的语言与具体的表现,某些场景下相当有用,语法如下:
object.toLocaleString([locales [, options]]);
locales 参数用于指定格式化对象时使用的语言环境,默认为当前环境的语言,可以不传。该参数具体可选的值可以参考这里,一般而言使用 en 或 zh 即可应付绝大多数情况。例子如下:
const date = new Date();
date.toLocaleString('zh'); // 2018-4-4 15:08:38
date.toLocaleString('en'); // 4/4/2018, 3:08:38 PM
const num = 2333333;
num.toLocaleString('zh', { style: 'currency', currency: 'CNY' }); //¥2,333,333.00
num.toLocaleString('zh', { style: 'currency', currency: 'cny', currencyDisplay: 'code' }); //CNY2,333,333.00
num.toLocaleString('zh', { style: 'currency', currency: 'cny', currencyDisplay: 'name' }); //2,333,333.00人民币