语法

最后更新于:2022-04-02 03:24:52

[TOC] [https://wangdoc.com/javascript/](https://wangdoc.com/javascript/) ## typeof ``` typeof 123 // "number" typeof '123' // "string" typeof false // "boolean" typeof undefined typeof window // "object" typeof {} // "object" typeof [] // "object" typeof null // "object" 历史原因 ``` ## 整数 ### null 与 undefined 区别 都可以在判断的时候表示 fase; 只有在转为数字时候 ``` Number(null) // 0 Number(undefined) // NaN ``` ### 判断为声明的js变量 ``` // 错误的写法 if (v) { // ... } // 报错: v is not defined // 正确的写法 if (typeof v === "undefined") { // ... } ``` ### NaN NaN 是js整数类型的特殊值,保表示非数字 ``` 5 - 'x' // NaN Math.sqrt(-1) // NaN 0 / 0 // NaN typeof NaN // 'number' NaN + 32 // NaN ``` #### 判断是否是 NaN ``` isNaN(NaN) // true isNaN(Number('Hello')) // true ``` 利用 NaN 不等于自身来判断最有效 ``` function myIsNaN(value) { return value !== value; } ``` ### 转为整数 ``` parseInt(' 8') // 8 parseInt('8a') // 8 parseInt('12**') // 12 parseInt('12.34') // 12 parseInt('15e2') // 15 parseInt('15px') // 15 parseInt('0x10') // 16 以十六进制转换 parseInt('abc') // NaN parseInt('.3') // NaN ``` #### 转为进制数 ``` parseInt('1000', 10) // 1000 parseInt('1000', 2) // 8 parseInt('1000', 6) // 216 parseInt('1000', 8) // 512 ``` ### 转为浮点数 ``` parseFloat('3.14') // 3.14 parseFloat('314e-2') // 3.14 如果字符串符合科学计数法,则会进行相应的转换。 ``` ## 字符串 ### Unicode 字符集 ``` var s = '\u0061'; //a var s = '\u00A9'; //© ``` js 只支持 UTF-16 支持不完整,两字节的字符,不支持四字节的字符 ### Base64 转码 - `btoa()`:任意值转为 Base64 编码 - `atob()`:Base64 编码转为原来的值 ``` var string = 'Hello World!'; btoa(string) // "SGVsbG8gV29ybGQh" atob('SGVsbG8gV29ybGQh') // "Hello World!" ``` ## 函数 ### 函数表达式添加函数名 ``` var print = function demo(){ console.log(demo.name); //demo }; print(); ``` ### 函数的属性和方法 #### name 值 ``` function f1() {} f1.name // "f1" var f2 = function () {}; f2.name // "f2" var f3 = function myName() {}; f3.name // 'myName' ``` 用途: 当函数通过参数传入时,可以获取函数名 ``` var myFunc = function () {}; function test(f) { console.log(f.name); } test(myFunc) // myFunc ``` #### length ``` function f(a, b) {} f.length // 2 ``` ### arguments 函数参数 对象,非数组 ``` var f = function (one) { console.log(arguments[0]);//1 console.log(arguments[1]);//2 console.log(arguments[2]);//3 } f(1,2,3) ``` ### 闭包 ``` function a(){ var n =12; function b(){ console.log(n); } return b; } var c = a(); c()//12 ``` 闭包的作用: * 可以读取函数内部的变量, * 这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在 #### 变量始终保存在内存中 ``` function num(stat){ return function () { return stat++; } } var a = num(0); a();//0 a();//1 a();//2 ``` #### 初始化一个值 ``` function apiConnect(apiKey) {   function get(route) {     return fetch(`${route}?key=${apiKey}`);   }   function post(route, params) {     return fetch(route, {       method: 'POST',       body: JSON.stringify(params),         headers: {           'Authorization': `Bearer ${apiKey}`         }       })   }   return { get, post } } const api = apiConnect('my-secret-key'); // No need to include the apiKey anymore api.get('http://www.example.com/get-endpoint'); api.post('http://www.example.com/post-endpoint', { name: 'Joe' }); ``` ## 数组 数组是一种对象 数组可放入任意类型的值 ``` var arr = [ {a: 1}, [1, 2, 3], function() {return true;} ]; arr[0] // Object {a: 1} arr[1] // [1, 2, 3] arr[2] // function (){return true;} ``` ### length - 如果赋值的长度小于原始长度,则会截取到赋值的长度 - 设置`length=0` ,清空数组 ## 错误处理机制 ### 原生错误类型 - SyntaxError 对象 : 解析代码时发生的语法错误 - ReferenceError 对象 : 引用一个不存在的变量时发生的错误。 - RangeError 对象 : 一个值超出有效范围时发生的错误 - TypeError 对象 : 变量或参数不是预期类型时发生的错误 - URIError 对象 : URI 相关函数的参数不正确时抛出的错误,主要涉及`encodeURI()、decodeURI()、encodeURIComponent()、decodeURIComponent()、escape()和unescape()`这六个函数 例子: ``` var err2 = new RangeError('出错了,变量超出有效范围!'); err3.name// "RangeError" err3.message // "出错了,变量类型无效!" ``` ### 自定义错误 [推荐] ``` function UserError(message,code){ this.message = message || "默认错误信息"; this.name = "UserError"; this.code = code || undefined; } UserError.prototype = new UserError(); UserError.prototype.constructor = UserError try { throw new UserError("错误消息", 400) ;// 第二参数可不填 } catch (e) { console.log(e.message); console.log(e.code); } ``` ### Boolean,Number,String 类型转换 ``` Boolean('a');//true Number('123');//123 String(true);//true ``` ## 运算符 ### 按位非运算符“~” #### ~value ``` if(arr.indexOf(ele) > -1){...} //易读 if(~arr.indexOf(ele)){...} //简洁 ``` #### ~~value `~~value`可以代替`parseInt(value)` ``` parseInt(-2.99) //-2 ~~(-2.99) //-2 ``` ### 强制转布尔 `!!`
';