💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
### 值 #### 一、数组 数组本身就是对象 ``` var a = [0]; a.length; //1 a["name"] = "qc"; a.length; //1 a["name"]; //qc a.name; //qc var b = [0]; b.length; //1 //如果属性能被强制转换为十进制数字时,将会被当做数组索引使用 b["10"] = 42; b.length; //11 ``` 伪数组使用数组的api ``` function foo() { var arr = Array.prototype.slice.call(arguments); arr.push('bam'); console.log(arr); } foo('bar', 'baz'); // ['bar', 'baz', 'bam'] ``` #### 二、字符串 字符串如何借用数组的api ``` var a = "foo"; var c = Array.prototype.join.call(a, "-"); //f-o-o var d = Array.prototype.map.call(a, function(v) { return v.toUpperCase() + "." }).join(""); //F.O.O. ``` #### 三、数字 js使用的是双精度格式的浮点数(即64位二进制) ``` var a = 42\42.5\.5\42.\42.0 var b = 5E10 //50000000000 b.toExponential(); //"5e+10" //特别大和特别小的数字默认使用指数格式 var c = b * b; //2.5e+21 ``` 小数点非0数字后面的所有0都会被忽略掉 toFixed和toPrecision ``` var a = 42.59 a.toFixed(0); //"43" a.toFixed(1); //"42.6" a.toFixed(2); //"42.59" a.toFixed(3); //"42.590" a.toFixed(4); //"42.5900" 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" ``` ``` var a = 42; a.toFixed(3); //"42.000" //.被视为42的一部分 42.toFixed(3); //SyntaxError (42).toFixed(3); //"42.000" //相当于(42.).toFixed(3),第一个.被视为42的一部分,第二个.调用toFixed 42..toFixed(3); //"42.000" ``` 小数的运算 ``` 0.1 + 0.2 != 0.3 //相加的结果可能是0.30000000000004 //常见的解决方案是指定一个误差范围 if(!Number.EPSILON) Number.EPSILON = Math.pow(2, -52); function isEqual(n1, n2) { return Math.abs(n1, n2) < Number.EPSILON; } isEqual(0.1 + 0.2, 0.3) ; //true ``` 整数的安全值范围是-2^53 + 1到2^53 - 1,超过这个范围就会产生精度丢失,变为无穷数Infinity 检测一个变量是否是整数 ``` //es6 Number.isInteger(n); //es5 //typeof NaN 一样是number //NaN % 1 -> NaN typeof n == "number" && n % 1 == 0 ``` 检测一个数字是否安全 ``` //es6 Number.isSafeInteger(n); //es5 typeof n == "number" && n % 1 ==0 && Math.abs(n) <= Number.MAX_SAFE_INTEGER ``` #### 四、特殊数值 null和undefined的区别 null指空值,undefined指没有值;null指曾赋过值,现在没有值,undefined值从未赋过值;null是特殊关键字,不是标识符,不能当做变量来使用,而undefined是标识符,可以当做变量使用。 void:让表达式不返回值,但变量本身没有被更改 ``` var a = 2; console.log(void a, a); //undefined 2 ``` 任何与NaN所做的比较均为false ``` var a = 2 / "foo"; a; //NaN a == NaN; //false a === NaN; //false NaN !=(!===) NaN; //true ``` 比较两个值是否相等(适用于所有情况) ``` //es6 Object.is(a, b) //es5 Object.is = function(a, b) { if(a === 0 && b === 0) { return 1 / a === 1 / b //-0的情况,因为1/-为-Infinity, 0===-0为true } if(a !== a){ return b !== b //NaN的情况 } else { return a === b } } ``` #### 五、值和引用 单值:number、string、null、undefined、boolean 复合值:object(包括array)、function ``` var a = [1, 2, 3]; var b = a; b.push(4); a; //[1, 2, 3, 4]; //改变了b的引用 b = [7, 8, 9]; b.push(10); b; //[7, 8, 9, 10] a; //[1, 2, 3, 4] //只是清空数组,并没有更改引用 b = a; b.length = 0; b; //[] a; //[] ```