【你不知道的JavaScript】(01)基础+数组+字符串+数字

本文章仅针对我自己在看书过程中对一些不太清楚的知识点进行查漏补缺——《你不知道的JavaScript(中卷)》第一部分类型和语法中的 第一章+第二章

JavaScript基础

JavaScript是什么类型的语言

动态类型语言:在运行期进行类型检查的语言,也就是在编写代码的时候可以不指定变量的数据类型,比如Python和Ruby

静态类型语言:它的数据类型是在编译期进行检查的,也就是说变量在使用前要声明变量的数据类型,这样的好处是把类型检查放在编译期,提前检查可能出现的类型错误,典型代表C/C++和Java

强类型语言,一个变量不经过强制转换,它永远是这个数据类型,不允许隐式的类型转换。举个例子:如果你定义了一个double类型变量a,不经过强制类型转换那么程序int b = a无法通过编译。典型代表是Java

弱类型语言:它与强类型语言定义相反,允许编译器进行隐式的类型转换,典型代表C/C++

参考链接:https://blog.csdn.net/hard_days/article/details/84967298

JavaScript是动态类型语言、弱类型语言

《你不知道的JavaScript(中卷)》30页

“喜欢强类型(又称静态类型)语言的人也许会认为“类型”一词用在这里不妥。“类型”在强类型语言中的涵义要广很多。”

这个翻译好像有点不准确?这样描述会让读者误解强类型就是静态类型

JavaScript中如何判断一个值为null

  1. !a && typeof a === 'object'

  1. Object.prototype.toString.call(null) === '[object Null]'

undefined与undeclared有什么区别

在JavaScript中undefined与undeclared是两码事,

  1. undefined 是值的一种,undeclared 则表示变量还没有被声明过

  1. 在我们试图访问"undeclared" 变量时这样报错:ReferenceError: a is not defined,并且 typeof 对 undefined 和 undeclared 变量都返回 "undefined"

谈谈undefined和null

相同

Undefined和Null两种数据类型都只有一个字面值,分别是undefined和null

Undefined和Null类型在转换为Boolean类型的值时,都会转换为false

不同

null

  1. null代表空值

  1. null 是一个特殊关键字,不是标识符,我们不能将其当作变量来使用和赋值

  1. null是原型链的尽头

  1. typeof null === 'object'

  1. null + 0 = 0

  1. 一个对象使用完后将其赋值为null,有利于垃圾回收释放内存

undefined

  1. undefined表示变量声明过但并未赋过值

  1. undefined是一个标识符,可以被当作变量来使用和赋值

  1. 未赋值的值是undefined

  1. typeof undefined === 'undefined'

  1. undefined + 0 = NaN

数组

什么是稀疏数组

下列关于数组的打印结果是什么

var a = [ ];
console.log(a.length);
a[2] = [ 3 ];
console.log(a.length);

a["foobar"] = 2;
console.log(a["foobar"]);

a["3"] = 42;
console.log(a.length);

console.log(a.join())

console.log(a.map((_, i) => i))

答案及解释如下

var a = [ ];
console.log(a.length); // 0

// 在创建“稀疏”数组(sparse array,即含有空白或空缺单元的数组)时 其中的“空白单元”(empty slot)的值为undefined, 但这和显式赋值为 undefined (a[1] = undefined )还是有所区别
a[2] = [ 3 ];
console.log(a.length); // 3


a["foobar"] = 2;
console.log(a["foobar"]); // 2

a["3"] = 42;
console.log(a.length); // 4

// join假定数组不为空,通过length属性遍历其中的元素
console.log(a.join()) // ,,3,42

// map无法遍历空的单元格 有用js写算法题的朋友可能更有体会 初始化数组的时候通常要先fill再map赋值才有效果
console.log(a.map((_, i) => i)) // 不同浏览器打印的结果不同 微软浏览器结果为[空 ã2, 3, 42]

不同浏览器打印稀疏数组的结果不同

建议不要创建和使用空单元数组

类数组有哪些,怎么转数组

类数组概念:类数组是有一个 length 属性和从零开始索引的属性的对象,但是没有 Array 的内置方法

类数组:DOM 查询操作返回的 DOM 元素列表,函数里的arguments,有lenth的对象等

转化

如果这个类数组是一个DOM元素列表或者是arguments这类,则有以下四个方法

  1. Array.prototype.slice.call(arguments) 或 [].slice.call(arguments)

  1. Array.from(arguments)

  1. [...arguments]

  1. 创建一个数组,for循环遍历类数组的子项,添加到数组中

如果这个类数组是一个普通的类数组,则有以下两种方法

  1. Array.prototype.slice.call(arguments) 或 [].slice.call(arguments)

  1. Array.from(arguments)

注意:虽然字符串都可以通过上述方法转换为字符串,但是字符串不是对象,因此不是类数组,字符串之所以可以用上面的方法转化因为字符串是可迭代的

数组有哪些常用方法

  1. 纯函数

map filter slice concat(返回值为数组)

some every(返回值为布尔值)

find findIndex indexOf(查找)

reduce(返回值可以为任何类型的值)

forEach(返回值为undefined)

join toString(返回值为字符串)

  1. 非纯函数

push pop unshift shift splice(增删改操作)

sort reverse fill

字符串

字符串不可变是指什么

字符串不可变是指字符串的成员函数不会改变其原始值,而是创建并返回一个新的字符串

字符串有哪些常用方法

indexOf lastIndexOf search includes(查找)

split replace replaceAll match(可以用正则表达式)

slice substring substr(截取)

toLowerCase toUpperCase(大小写)

charCodeAt String.fromCharCode(ascii与字符串转化)

trim

charAt

另外,字符串可以找数组借用部分方法

a.join; // undefined
a.map; // undefined
var c = Array.prototype.join.call( a, "-" );
var d = Array.prototype.map.call( a, function(v){
return v.toUpperCase() + ".";
} ).join( "" );
c; // "f-o-o"
d; // "F.O.O."

但是,我们无法“借用”数组的可变更成员函数,如reverse等,因为字符串是不可变的

数字

var a = 5E10;
a; // 50000000000
a.toExponential(); // "5e+10"
var b = a * a;
b; // 2.5e+21
var c = 1 / a;
c; // 2e-11

如何判断较小的浮点数是否相等

设置一个误差范围值,通常称为“机器精度”,对 JavaScript 的数字来说,这个值通常是 2^-52(2.220446049250313e-16),从 ES6 开始,该值定义在 Number.EPSILON

function numbersCloseEnoughToEqual(n1,n2) {
return Math.abs( n1 - n2 ) < Number.EPSILON;
}
var a = 0.1 + 0.2;
var b = 0.3;
numbersCloseEnoughToEqual( a, b ); // true

NaN

NaN代表不是数字的数字,用于指出数字类型中的错误情况,但是类型仍是数字,即typeof NaN === 'number'

NaN 是一个特殊值,它和自身不相等,且是唯一个自反的值,即 NaN !== NaN

判断一个值是否为NaN可以用Number.isNaN(),而不要使用全局的isNaN。全局要检查参数不是NaN,也不是数字,或者利用NaN !== NaN的特性判断

Infinity

代表无穷

1 / 0 === Infinity

1 / -0 === -Infinity

0

带符号位的0存在的意义是,有些应用程序中需要数字的符号位来代表其他信息,例如移动的方向

乘法和除法可以得到负零 0 / -3 === -0 0 * -3 === -0

加法和减法运算不会得到负零

+0 === -0

JSON.stringify(-0) === '0'

JSON.parse("-0") === '-0'

Object.is()可以判断两个值是否绝对相等

Object.is(NaN, NaN) === true Object.is(-0, +0) === false

实现代码如下

Object.is = function(v1, v2) {
    // 判断是否是-0
    if (v1 === 0 && v2 === 0) {
    return 1 / v1 === 1 / v2;
    }
    // 判断是否是NaN
    if (v1 !== v1) {
    return v2 !== v2;
    }
    // 其他情况
    return v1 === v2;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值