重学javascript的基础语法

40 阅读6分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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"]);//数组里的值是ab,表示obj对象留下来的键是ab
        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() 就可以变成时间戳