发布于 2024 年 2 月 26 日,星期一
JavaScript中类型、值和原生函数的核心概念,强调了它们在前端开发中的重要性。类型决定了数据的性质和操作方式,值是类型的具体实例,而原生函数则是JavaScript提供的内置工具,用于处理和操作这些值。理解这些基础概念有助于开发者编写更高效、更可靠的代码,避免常见的类型错误和逻辑陷阱。通过深入剖析这些元素,开发者能够更好地掌握JavaScript的底层机制,提升编程技能和代码质量。
系列首发于公众号『非同质前端札记』https://mp.weixin.qq.com/s?__biz=MzkyOTI2MzE0MQ==&mid=2247485576&idx=1&sn=5ddfe93f427f05f5d126dead859d0dc8&chksm=c20d73c2f57afad4bbea380dfa1bcc15367a4cc06bf5dd0603100e8bd7bb317009fa65442cdb&token=1071012447&lang=zh_CN#rd ,若不想错过更多精彩内容,请“星标”一下,敬请关注公众号最新消息。
Undefined、Null、Boolean、String、Number、Object、Symbol
在函数中的 length 属性是参数的个数
function a(b,c){
// do something
}
a.length; // 2
typeof [...] 为什么等于 object?
数组也是对象,但确切来说,它是 object 的一个 "子类型"
typeof [1,2,3] === 'object'; // true
typeof typeof 42; // string
// typeof 42 首先会返回 number, 然后 typeof number 返回 string
数组也是对象,但确切来说,它是 object 的一个 "子类型"
使用
delete 操作符不会影响数组长度
let a = ['a', 'b', 'c', 'd'];
delete a[2];
console.log('a ------>', a); // [ 'a', 'b', <1 empty item>, 'd' ]
console.log('a ------>', a.length); // 4
除了通过使用数字索引的方式,其他都不计算进数组长度内
let a2 = [];
a2[0] = 1;
a2['foo'] = 2;
console.log('a2.length ------>', a2.length); // 1
console.log("a2['foo'] ------>", a2['foo']); // 2
console.log('a2.foo ------>', a2.foo); // 2
var a = [];
a['13'] = 42;
a.length; // 14
var arr = Array.from(arguments);
Array.prototype.slice.call();
数字前面的 0 可省略
var a = 0.42;
var b = .42;
var a = 42.59;
a.toPrecision( 1 ); // "4e+1"
a.toPrecision( 2 ); // "43"
a.toPrecision( 3 ); // "42.6"
a.toPrecision( 4 ); // "42.59"
a.toPrecision( 5 ); // "42.590"
a.toPrecision( 6 ); // "42.5900"
对于
. 操作符来说,因为他们是一个有效的数字字符,会被优先识别为数字常量的一部分,然后才是对象属性访问运算符。
// 无效语法:
42.toFixed( 3 ); // SyntaxError
// 下面的语法都有效:
(42).toFixed( 3 ); // "42.000"
0.42.toFixed( 3 ); // "0.420"
42..toFixed( 3 ); // "42.000"
// 注意其中的空格
42 .toFixed(3); // "42.000"
9007199254740991
,在 ES6 中被定义为 Number.MAX_SAFE_INTEGER
。最小整数是 -9007199254740991
,在 ES6 中被定义为 Number.MIN_SAFE_INTEGER
。Number.isInteger(..)
方法:Number.isInteger( 42 ); // true
Number.isInteger( 42.000 ); // true
Number.isInteger( 42.3 ); // false
Number.isInteger(..)
方法:if (!Number.isInteger) {
Number.isInteger = function(num) {
return typeof num == "number" && num % 1 == 0;
};
}
Number.isSafeInteger( Number.MAX_SAFE_INTEGER ); // true
Number.isSafeInteger( Math.pow( 2, 53 ) ); // false
Number.isSafeInteger( Math.pow( 2, 53 ) - 1 ); // true
if (!Number.isSafeInteger) {
Number.isSafeInteger = function(num) {
return Number.isInteger( num ) &&
Math.abs( num ) <= Number.MAX_SAFE_INTEGER;
};
}
null 和 undefined。nul 是一个特殊关键字,不是标识符,不能将其当做变量来使用和赋值
。但 undefined 确实一个标识符,可被当做变量来使用和赋值。null: 指空值
undefined:指没有值
NaN:NaN 是一个特殊值,它和自身并不相等,是唯一一个非自反(即 x === x 不成立的值),而 NaN != NaN 为 true。
var a = 2 / 'foo';
isNaN(a); // true
var a = 2 / "foo";
var b = "foo";
Number.isNaN( a ); // true
Number.isNaN( b ); // false——好!
if (!Number.isNaN) {
Number.isNaN = function(n) {
return n !== n;
};
}
delete
操作符不会影响数组长度对于
. 操作符来说,因为他们是一个有效的数字字符,会被优先识别为数字常量的一部分,然后才是对象属性访问运算符。
Number.isInteger(..)
方法9007199254740991
,在 ES6 中被定义为 Number.MAX_SAFE_INTEGER
。最小整数是 -9007199254740991
,在 ES6 中被定义为 Number.MIN_SAFE_INTEGER
var a = 2 / "foo";
var b = "foo";
Number.isNaN( a ); // true
Number.isNaN( b ); // false ——好!
• String()
• Number()
• Boolean()
• Array()
• Object()
• Function()
• RegExp()
• Date()
• Error()
• Symbol() ——ES6 中新加入的!
var a = new String( "abc" );
typeof a; // 是"object",不是"String"
a instanceof String; // true
Object.prototype.toString.call( a ); // "[object String]"
使用构造函数创建出来的是封装了基本类型值的封装对象。
typeof 在此返回的是对象类型的子类型。
[[Class]]
Object.prototype.toString.call( [1,2,3] );
// "[object Array]"
Object.prototype.toString.call( /regex-literal/i );
// "[object RegExp]"
Object.prototype.toString.call( null );
// "[object Null]"
Object.prototype.toString.call( undefined );
// "[object Undefined]"
Object.prototype.toString.call( "abc" );
// "[object String]"
Object.prototype.toString.call( 42 );
// "[object Number]"
Object.prototype.toString.call( true );
// "[object Boolean]"
var a = new Boolean( false );
console.log('a ------>', a); // [Boolean: false]
console.log(Boolean(a)); // true
if (!a) {
console.log( "Oops" ); // 执行不到这里
}
Object()
函数(不带 new 关键字)var a = "abc";
var b = new String( a );
var c = Object( a );
typeof a; // "string"
typeof b; // "object"
typeof c; // "object"
b instanceof String; // true
c instanceof String; // true
Object.prototype.toString.call( b ); // "[object String]"
Object.prototype.toString.call( c ); // "[object String]"
Object()
函数(不带 new 关键字)var b = new String( a );
var c = Object( a );
Object.prototype.toString.call( b ); // "[object String]"
Object.prototype.toString.call( c ); // "[object String]"
Q:(question)
R:(result)
A:(attention matters)
D:(detail info)
S:(summary)
Ana:(analysis)
T:(tips)