JavaScript高级程序设计—第三章(JavaScript概念)

前端之家收集整理的这篇文章主要介绍了JavaScript高级程序设计—第三章(JavaScript概念)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1.在ES5非严格模式下,关键字有:class、const、import、export、super、extends、enum。在严格模式下又新增了以下关键字:let、interface、package、public、static、yield、private、protected、implements、eval、arguments。

2.typeof操作符:可以返回操作数的类型(但是对于数组、对象、null会统一返回object,因此不能用来区分数组、对象、和null)。

注意:typeof操作声明了未赋值的变量时,会返回undefined。通常情况下,我们操作一个未声明变量时会报错,但是typeof操作没有声明的变量时,并不会报错,而是返回undefined。

3.对于number类型的数据,浮点型数字所占的内存空间是整型数字的两倍,因此解析时只要浮点数可以转换成整数,js会尽可能的将浮点型转换为整型,例如:

4.对于基于IEEE754的浮点数而言,其最高精度时17位小数,一旦小数部分超过了17位,就会存在舍入误差。例如:

扩展:对于0.1 + 0.2 != 0.3的问题解释:
基于IEEE754数值的语言都会有这个问题,因为在计算机内部数字进行计算时,先要把数字转化成对应的二进制形式才能进行计算,对于有些数字在转换成二进制时,是不能被精确的表示的,例如0.1转换成二进制是 0.00011001100110011...(无限循环,没有精确值),因此计算后的结果也不是精确值。

5.数值的范围:在大多数浏览器中Number.MIN_VALUE是js所能表示的最小值,这个值为5e-324;对应的Number.MAX_VALUE是最大值。在js中如果数值大于最大值,则表示无穷大(Infinity),如果小于最小值,则表示无穷小(-Infinity)。对于数值类型,可以使用isFinite()函数来判断数值是否是无穷大(小),如果在范围内则会返回true。

6.NaN非数字:首先NaN != 任何值(包括自己),在js中任何数字除以0得到的值都是NaN。在判断一个值是否是数值时,可以使用isNaN()函数,对于非数值类型的值,在判断前会先使用Number()函数转化为数字,例如:

7.数值转换:Number()、parseInt()、parseFloat()函数
Number()函数可以用于所有类型数据,其转换规则如下:
(a)boolean值false转换为0,true转化为1;
(b)null转换为0;
(c)undefined转化为NaN;
(d)如果是字符串则按照下面规则转换:

parseInt()函数可以将一个字符串转换为整型数值,接收两个参数,第一个是需要转化的字符串,第二个参数时字符串的基数,省略第二个参数时如果没有特定的开头(例如16进制开头0x),函数默认基数是十进制。

parseFloat()转化规则与parseInt()函数类似,但是parseFloat()只接受一个字符串参数,不能指定基数,因此解析时都是按照16进制进行解析,例如:
console.log(parseFloat("0xAF")); // 0
console.log(parseFloat("123abc")); // 123
console.log(parseFloat("5.14.86")); // 5.14
console.log(parseFloat(".18")); // 0.18

8.字符串:在js中字符串其实是不可变的,也就是说字符串一旦创建它的值就不能被改变,要改变一个字符串就需要摧毁原来的字符串,然后再创建一个新的字符串。

9.字符串转换:toString()函数可以将其他类型的数据转化为字符串类型,在将数值类型的值转化为字符串时可以传递一个可选参数radix(字符串转化为radix对应的进制输出)。但是对于null和undefined没有对应的toString()方法,因此如果要将null和undefined转化为字符串需要使用String()方法

10.javascript运算符优先级比较(相同层级在表达式中从左至右依次执行)
(a)一元运算符:++(自加)、--(自减)、+(取正)、-(取负)、!(逻辑非)、`(按位非)
(b)*(乘)、/(除)、%(取模)
(c)加减
(d)位运算:左移n位(<< )、右移n位(>>)
(e)大小比较:<、<=、>、>=
(f)等于比较:==、!=、===、!==
(g)剩下的从左到右优先级递减:&(按位与)、^(按位异或)、|(按位或)、&&(逻辑与)、||(逻辑或)

11.对于逻辑与和逻辑或运算符,首先它们都是短路运算符(一旦条件成立,就不会进行后面的计算)

12.对于加减乘除运算符,有以下规则:
(a)任何数与NaN运算结果均为NaN;
(b)Infinity乘0结果为NaN;
(c)Infinity除以Infinity结果为NaN;
(d)0除以0结果为NaN;
(e)任何数除以0,结果为Infinity或-Infinity;
(f)减法运算时,Infinity减Infinity结果为NaN;
(g)进行加法运算时,若其中一个数为字符串,另一个数则调用toString或String方法先转化为字符串再进行字符串拼接。

13.for in语句:用来枚举对象的属性,但是在js中对象属性是没有顺序的,因此使用for in遍历出来的属性顺序是不可预测的,所有的属性都会被返回一次,但可能会因浏览器而异,其用法如下:

14.lable语句:lable语句可以在代码添加标签,以便将来使用(可以用来结束外层for循环),其用法如下:

15.with语句:with语句的作用是将代码块的作用域设置到一个特定的对象,但是由于大量使用with语句会导致性能下降,因此不建议使用with语句,在严格模式下也不能使用with语句其,用法如下:
let name = "dayday",

object1 = {
  age: 20
},object2 = {
  sex: "man"
};

with(object1) {
console.log(name); // dayday,可以访问全局变量
console.log(age); // 20,手动传入的object1中的属性
console.log(sex); // 报错,sex is not defined,不能访问object2中的属性
}

16.switch语句:switch语句是流程控制语句,与if语句的作用类似,其用法如下:

上面代码会在控制台输出dayday字符串,但是请注意,在每个case选择语句结束后一定要加上break;语句,不然switch语句会执行后面所有的语句,依次输出dayday、lili、huahua、not find。

17.javascript函数参数:首先js中的函数参数和其他语言不同,js在解析函数时,不介意传递了参数的个数是否正确,也不介意传递参数的类型是否正确(js函数没有重写机制,但是可以模拟重写机制),没有传递值的参数会自动被赋值为undefined,传递的所有参数都放在一个arguments的类数组对象中,函数接受到的始终是这个arguments数组(可以通过判断arguments的长度来判断传递的参数个数,实现简单的重写)。
在非严格模式下,修改arguments[n]或者直接修改参数,其对应的值都会同步被修改。但是在严格模式下,修改其中一个值,其另外一个对应的值不会同步被修改,例如:

console.log("参数name=" + name + " arguments[0]=" + arguments[0]);    // 参数name=dayday arguments[0]=dayday
console.log("参数age=" + age + " arguments[1]=" + arguments[1]); // 参数age=18 arguments[1]=18
}

function noStrictFun(name,age) {
"use strict";
name = "dayday";
arguments[1] = 18;

console.log("参数name=" + name + " arguments[0]=" + arguments[0]); // 参数name=dayday arguments[0]=huahua
console.log("参数age=" + age + " arguments[1]=" + arguments[1]); // 参数age=20 arguments[1]=18
}

strictFun("huahua",18);
noStrictFun("huahua",18);

18.js模拟重载:
(a)利用arguments的length属性模拟重载(根据参数不同,执行不同的操作):

(b)利用闭包的特性进行方法重载:

function method(obj,name,fnc){
let old = obj[name];

obj[name] = function(){
if(arguments.length === fnc.length){ // arguments.length是实参(调用时)的个数,fnc.length时形参(定义时)的个数
return fnc.apply(this,arguments);
}else if(typeof old === "function"){
return old.apply(this,arguments);
}
}
}
// method函数返回的是一个函数,因此method调用之后不会被释放,即old变量会一致存在内存中

method(people,"find",function(){
return "0个参数";
})
// 第一次调用method方法,此时old == undefined

method(people,function(firstname){
return "1个参数";
})
// 第二次调用method方法,此时old为第一次绑定的函数

method(people,function(firstname,lastname){
return "2个参数";
})
// 第三次调用method方法,此时old为第二次绑定的函数
// 实际上在内存空间中存在三个people.find()的内存空间

// 每一次调用时,都会先从最后一次绑定的方法开始查找,知道形参和实参相同,则返回绑定的函数,如果不相同则返回old变量中存储的方法
console.log(people.find()); // 需要根据old向上查找两次
console.log(people.find("Zhang")); // 需要根据old向上查找一次
console.log(people.find("Zhang","san")); // 不需要查找,即最后绑定的方法

原文链接:https://www.f2er.com/js/416234.html

猜你在找的JavaScript相关文章