类型

类型

  • 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 ( 补充代码,用来修复当前运行环境中缺失的功能 )
posted @ 2020-06-03 09:31  pengsn  阅读(147)  评论(0编辑  收藏  举报