开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 22天,点击查看活动详情
基础类型
7种类型,typeof 就 null 特殊,其他都很正常。
type 函数 function
函数也具备leng属性,这个属性的值是函数参数的个数。
在js中变量是不具备类型的,只有值有类型,我们typeof是针对那个值的一个类型。
typeof 返回的所有类型都是字符串,例如 : typeof 42 返回的是 "number"
typeof的好处,可以用它来判断,用typeof进行判断后是否等于undefined来判断数据是否存在。例如 直接写 if(a){} 这样会报错。如果写成如下代码形式就不会报错:
if(typeof a=="undefined"){
console.log("a...");
}
值
数组
稀疏数组,长度按照下标的最大值+1。但是实际长度不是这样的。
数组可以是键值对,但是这个键值对是不放在数组长度里边的。
键值对中的键如果可以强制转换成十进制则也可以记录在长度里边。例如键:“13”
类数组转换成数组
例如 argument 和 dom获取到的集合
let arr=Array.prototype.slice.call(argument);
这样arr就是一个真实的数组了。
Es6中 Array.from(argument);//同样可以把类数组转换成数组。
字符串
字符串也是可以使用concat的。
var str="foo";
var b="bar";
let c=str.concat(b);
console.log(c);//foobar
在b[0]中是可以获取到数据的。但是不能够修改值。
b.charAt(0) 也是获取到一个字符。字符串的值是不可修改的。
数组和字符串的区别
数组是在原始的变量上进行操作。而字符串操作后都会返回一个新的值。
字符串虽然没有数组那样的一些方法,但是可以借用数组的方法。例如数组的join方法。
Array.prototype.join.call(str,"-");那么每个字符就是用 - 进行连接的。
数组reverse的特殊性:
数组有一些方法,字符串时无法使用的。例如reverse()是将数组反过来的方法。这个是改变数组本身。但是字符串时无法改变自己本身的所以无法使用。
但是我们可以通过字符串变成数组,然后数组反转后变成字符串。
字符串变成数组的方法是 split(""),reverse反转,join("")变成字符串。
数组类型
数字类型主要的地方
数值类型调用方法的点的问题。如: 42.tofixed(2) //会报错
数值类型在调用方法的时候是需要多加一个点的。因为本身js的数值类型就是双精度的,只是把.和后边的0省略掉了而已。
42 .toFixed(2) //42的后边有一个空格也是可以的
整数的检测:Number.inInteger();
undefined 和 null
null是关键字
但是undefined不是关键则
void运算符
void 变量;返回的是undefined 这个运算符的作用就是不返回值。
NaN无效数值
typeof NaN==="number" //true
NaN是一个自反的值。也就是NaN永远不等于NaN
全局工具函数isNaN();这个方法是非正常数值类型变量都会检测为true。
例如:NaN //true "a" //true--->晕了
所以我觉的是先判断是否是number其次判断是否是isNaN
console.log(Number.isNaN(NaN));//true
console.log(isNaN(NaN));//true
其实判断NaN还有一种更简单的方法:
那就是传入一个值,如果不等于它自己,那就说明是NaN 。因为在js中只有NaN不等于它自己。
值和引用
要确定,重新赋值时引用是断了的。
new Number(num); //这个产生的值是不会改变的。
原生函数
十个原生函数:
Number()
String()
Boolean()
Object()
Array()
Function()
Date()
RedExcp()
Error
Symbol()--es6新加入
通过new 创建的基本类型。上述的产生的类型,通过typeof 是 "object",因为都是对象了。
Object.prototype.toString.call(变量);
上边的十个原生函数结果如下:
let num=100;
let str="nihao";
let is=true;
let d=new Date();
let arr=[];
let f=function(){}
let re=/\d/;
let obj={};
let err=new Error();
console.log(Object.prototype.toString.call(re));//[object RegExp]
console.log(Object.prototype.toString.call(num));//[object Number]
console.log(Object.prototype.toString.call(is));//[object Boolean]
console.log(Object.prototype.toString.call(d));//[object Date]
console.log(Object.prototype.toString.call(arr));//[object Array]
console.log(Object.prototype.toString.call(f));//[object Function]
console.log(Object.prototype.toString.call(str));//[object String]
console.log(Object.prototype.toString.call(obj));//[object Object]
console.log(Object.prototype.toString.call(err));//[object Error]
console.log(Object.prototype.toString.call());//[object Undefined]
console.log(Object.prototype.toString.call(null));//[object Null]
console.log(Object.prototype.toString.call(undefined));//[object Undefined]
封装对象的问题
let b=new Boolean(false);//返回永远是true
并且typeof b 是object
如果要解决这个问题,需要使用不带new 的Object(),如:
let b=false;
let x=Object(b);
这样可以实现x的值是false。但是typeof 是object.
拆封
拆分的话使用的是valueOf是拆封的方法。
原生函数作为构造函数
Array()
如果只有一个参数,那么是参数的长度。如: new Array(3); 那么3是给length属性赋值。
Object(),Function(),RegExp()都不建议使用构造函数的形式
强制类型转换的一些总结
--转字符串
-
null,undefined,布尔,数字,函数 都是直接变成字符串,布尔值是true变成字符串 或者是false变成字符串。
-
数组是元素用逗号链接。
-
Object的类型是这个[object Object]
-
toString的返回必须是一个字符串
JSON字符串序列化
-
JSON.stirngify()字符串对undefined,function,symbol会忽略掉,也就是都会返回undefined。在数组中则会返回为 nulll 。
-
如果序列化的对象有toJSON方法,则会先调用这个方法后,返回的值再进行序列化。针对某一个些不能够序列化的值,最好一般用toJSON()进行安全返回后再进行序列化。toJSON返回的值是可以任何类型的,只要能序列化就可以。
-
对于包含循环引用的对象在序列化时会报错。
JSON字符串有用但不常用的方式
JSON.stirngify(对象,可选参数argument)
argument可以是数组(数组元素必须是字符串),也可以是函数。
这个使用其实是对要被序列化的对象进行进一步的处理。
- 第二个参数是数组
则第二个参数里边的字符串都是,对象要被留下来的键。
如下案例:
let obj={a:1,b:2,c:[3,4,5]}
let res=JSON.stringify(obj,["a","b"]);//数组里的值是a和b,表示obj对象留下来的键是a和b
console.log(res);
- 如何第二个参数是函数
则该函数是一个有键值对参数的函数,是对第一个参数对象的处理。返回的条件,就是值要留下来的条件。
如下代码:
let res=JSON.stringify(obj,function(k,v){
if(k!=="a"){
return v;
}
})
console.log(res);//结果是b和c的键留下来了
--toNumber()
其他类型转换成number型。
-
布尔 ture=1 false=0
-
undefined=>NaN null/""=>0
-
数组如果是空则为0,如果有一位数字类型则是数组类型。其他情况是NaN.
--toBoolean
- 除了这些是false外(undefined,null,"",+0,-0,NaN,fasle),其他都真值
- 假值被封装对象封装之后会变成真值。如下代码:
let a=new String("");
console.log(Boolean(a));//true
console.log([])//true
console.log(+[]);//false
toString和valueOf的分析
- 基础类型 有valueOf和 toString 两个方法。优先级是valueOf大于toString
- 对象类型 只有toString
以上两点主要是在类型的转换中进行使用。
数字和字符串之间的强制转换
String和Number之间的转换
强制转换各自都有方法 分别是Number() 和 String()
但是转变成String类型有toString()方法
转变成number类型的前边可以用 + 号
Number.prototype.toString=function(){
return "100";
}
console.log(typeof 42..toString());//true
在用+号转变成number类型并且进行计算时,最好是中间隔一个空格,如下:
let a="4";
let b=5+ +a;//先把a变成number类型才能相加,如不是字符串的相加。
Date转换成number
- +new Date() 就可以变成时间戳