类型
类型
- null, undefined, number, string, boolean, object, symbol
typeof 的值永远返回的是一个字符串
typeof undefined === 'undefined'
typeof 42 === 'number'
tyeeof 'good' === 'string'
typeof true === 'boolean'
typeof {} === 'object'
typeof Symbol() === 'symbol'
typeof null ==== 'object'
那么应该如何判空呢?
function fn(p1, p2, p3) {
console.info(p1, p2, p3);
}
function fn(p1,p2) {
console.info(p1,p2);
}
console.info(fn.length); // 3
console.info(fn());
函数的length属性表示该函数申明了几个形参
undefined 与 undeclared
- 变量已申明,但未赋值,则为undefined
- 变量未声明,却使用,则为undeclared 未申明
var a;
console.info(a); // undefined
console.info(b.c); // Uncaught ReferenceError: b is not defined
array, string, number是一个程序中最基本的组成部分
数值-值
- 稀疏数组:含有空白或者空缺单元的数组
- 字符串键值能够被强制转换为十进制数值的话,就会被当做数值索引来处理
var a = [];
a[0] =1;
a['good']=2;
console.info(a.length);
console.info(a[0]); //1
console.info(a['good']); //2
console.info(a); // [ 0: 1, 'good': 2, length : 1]
a['0'] = 'good-name'; // 会覆盖以上的 a[0] = 1;
以上: 建议数组还是通过存放数值索引值来存储
- Array-like转换
function array-like() {
var arr = Array.prototype.slice.call(arguments);
return arr;
}
ES6
var arr = Array.from(arguments);
字符串-值
字符串逆序; 通过array的reverse函数实现; 不适用unicode编码的文本数据
var a = 'hello world';
var reversA = a.split("").reverse().join("");
console.info(reversA);
数字-值
- 常用方法
- toFixed(number) ; 指定小数点后几位数值 number must be between 0 and 100 !!!返回结果为string
- toPrecision(number) 有效位数 number must be between 0 and 100 !!!返回结果为string
- js中唯一一个不等于自身的值 NaN
pollyfill
if(!Number.isNaN) {
Number.isNaN = function(n) {
return n!==n;
}
}
- 业务中存在方向向量 -0
function isNegZero(n) {
n = Number(n);
return ( n === 0 ) && (1/n === -Infinity);
}
内建函数
- String,Number,Boolean, Array, Object, Function, RegExp, Date, Error, Symbol
ToString
- Object.prototype.toString = "[object Object]"; 对象可以重写自身的toString()
- 如数组的toString
var a = [1,1,2,3,100];
console.info(a.toString()); // 1,1,2,3,100
ToNumber
- true =1 , false = 0 , undefined = NaN, null = 0
- 对象、数组会首先转换成相应的基本数据类型值,如果返回的是非数值的基本数据类型值,则再遵循以上规则将其转换成数字
var a = {
valueOf: function() {
return '32';
}
};
var b = {
toString: function() {
return '32';
}
};
var c = [3,2];
c.toString = function() {
return this.join('');
};
console.info(Number(a)); //32
console.info(Number(b)); //32
console.info(Number(c)); //32
ToBoolean
- 可以被强制转换为false的值
- 其他(不可以强制转换的值)
- 假值: undefined, null, NaN, -0 , +0 , "", false
时间戳转换
var timestamp = new Date().getTime();
var timestamp = Date.now();
var timestamp = +new Date();
逻辑运算符[|| &&]的短路机制
var b ;
var a = b?b:'b is undefined';
console.info(a);
var b;
var a = b || 'b is undefined';
console.info(a); // b is undefined
var c;
...
var e = c?d:f;
var e = c && f;
boolean
思考:
'true' == true?
'43' == true
'0' == false
1 == true
- 千万不要将基本数据类型与boolean类型直接比较==; 请使用(!!var)
大头的疑问,如下实现以下条件满足
if(a == 2 && a == 3) {
console.info('Yes, it is true')
}
------------奇迹代码---------------------------
var i = 2;
var a = new Number(2);
Number.prototype.valueOf = function() {
return i++;
};
if(a == 2 && a == 3) {
console.info('Yes, it is true')
}
附录
- polyfill ( 补充代码,用来修复当前运行环境中缺失的功能 )
如果觉得文章对您有用,请点下推荐。您的支持将鼓励我继续创作!