多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] # 每日单词 1. `pretty` 可爱 1. `format` 格式化 1. `insert` 插入 1. `upper` 单词大写 1. `lower` 单词小写 1. `Infinity` 无限 # 再谈函数 ## 声明后即运行 先声明在调用 ```javascript function hello() { console.log("hello world"); } hello(); ``` 声明及时调用 ```javascript (function hello() { console.log("hello world"); })(); (function() { console.log("hello world"); })(); ``` ## 对象的属性 > 对象只有属性, 当一个对象的属性的内容恰好是函数的时候, 我们把它叫做对象的方法 ```javascript var obj = { userName: "Xujunhao", hello: function() { console.log("hello world"); } }; obj.hello(); // 调用函数, 输出"hello world" ``` ```javascript var obj = { userName: "Xujunhao", hello: function() { console.log("hello world"); } }; function loveYou() { return "I love you"; } obj.loveYou = loveYou(); // 获取函数的返回值, 赋值给对象的属性 ``` ```javascript var obj = { userName: "Xujunhao", hello: function() { console.log("hello world"); } }; function loveYou() { return "I love you"; } obj.loveYou = loveYou; // 把函数的整个内容, 赋值给对象的属性 console.log(obj.loveYou()); // 输出 I love you ``` ## 函数进阶 > 函数的返回值, 可以是个函数 ```javascript function hello() { return hello1; } function hello1() { return hello2; } function hello2() { console.log("hello world"); } hello()()(); // "hello world" ``` # js 的一行, 和 html 的一行 > js 的一行, 可以理解成整个 js 文件 ```javascript hello(); // 输出hello world, 不会因为先调用而报错 function hello() { console.log("hello world"); } ``` > html 的一行, 可以理解成一个标签 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <script> hello(); // 因为调用时, 没有声明hello函数, 所以报错 </script> <script src="test2.js"></script> </body> </html> ``` > test2.js ```javascript function hello() { console.log("hello world"); } ``` # 回顾数据类型, 穿插强制类型数据转换 > 注意:js 三种引入方式, 不能混用 ## typeof 操作符 typeof 操作符的作用? > 显示数据类型 typeof 操作符, 可以返回多少类型? 1. undefined —— 如果这个值未定义; 1. boolean —— 如果这个值是布尔值; 1. string —— 如果这个值是字符串; 1. number —— 如果这个值是数值; 1. object —— 如果这个值是对象,arr,null ; 1. function —— 如果这个值是函数。 ```javascript console.log(typeof a); // undefined console.log(typeof 123); // number console.log(typeof "123"); // string console.log(typeof true); // boolean console.log(typeof false); // boolean console.log(typeof {}); // object function hello() { console.log("hello"); } console.log(typeof hello); // function console.log(typeof hello()); // undefined, 函数没有返回值的话, typeof检测为undefined console.log(typeof []); // array是特殊的object console.log(typeof undefined); // undefined console.log(typeof null); // object ``` typeof 的另一种写法 ```javascript console.log(typeof 123); // number console.log(typeof 123); // number ``` ## Undefined 类型 什么是 undefined? > 变量未定义时返回 undefined 未赋值的变量, 默认值就是 undefined ```javascript var a; console.log(typeof a); // undefined var b = undefined; console.log(b); // undefined ``` 如果未声明会怎样? ```javascript var a; console.log(typeof a); // undefined var b = undefined; console.log(typeof b); // undefined console.log(typeof c); // undefined ``` 如何区别未声明和未赋值? ```javascript var userName = ""; var userAge = 0; // var userObj = {}; console.log(typeof a); // string console.log(typeof c); // undefined ``` > 初始值的目的, 第一区分未赋值和未定义, 第二监控数据的变化 ## Null 类型 什么是 Null 类型 > 空对象 > 如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为 null 而不是其他值 ```javascript var userName = ""; var userAge = 18; var userObj = null; // 对象的初始值, 建议null console.log(Boolean(userObj)); // false ``` ## Boolean 类型 什么是 Boolean 类型? > 真或假 true or false 注意 true 和 True(python) ```javascript console.log(typeof True); // undefined console.log(typeof true); // boolean ``` 任何其他数据类型,都可以强制类型转换到 Boolean(使用 Boolean()) 1. undefined ==> boolean 1. string ==> boolean 1. number ==> boolean 1. object ==> boolean 1. function ==> boolean ```javascript console.log(Boolean(undefined)); // false console.log(Boolean(null)); // false console.log(Boolean("")); // false console.log(Boolean("hello")); // true console.log(Boolean(0)); // false console.log(Boolean(123)); // true console.log(Boolean(0.0)); // false console.log(Boolean([])); // true console.log(Boolean({})); // true ``` 不管函数有没有内容, 一律是 true ```javascript function hello() { console.log(); } console.log(Boolean(hello)); // true ``` ```javascript function hello() {} console.log(Boolean(hello)); // true ``` ## Number 类型 什么是数字类型 > 整数和浮点数 > 声明数字类型时的进制问题 ```javascript console.log(123); // 123 console.log(088); // 88 console.log(070); // 56 前面有0, 代表8进制 console.log(0x70); // 112 前面有0x, 代表16进制 ``` 浮点数的".1"和"1." 保存浮点数值需要的内存空间是保存整数值的两倍, 所以 1.0 会转成 1 ```javascript console.log(1.1); // 1.1 console.log(1.0); // 1 console.log(0.1); // 0.1 console.log(1); // 1 ``` 如果是一个极小的数(科学计数法) 如果是一个极大的数呢?(科学计数法) ```javascript console.log(0.00000000000000001); // 1e-17 console.log(0.001); // 0.001 console.log(0.0000001); // 7位会转科学计数法 console.log(1000000000000000000000000000); // 1e+27 console.log(1000000000000000000000); // 21位转科学计数法 ``` 浮点数的比较问题 不要比较浮点数, 容易出事儿 ```javascript // 0.1+0.2 = 0.3 console.log(0.1 + 0.2); // 0.30000000000000004 console.log(Boolean(0.1 + 0.2 == 0.3)); // false ``` 数值范围问题 ```javascript console.log(Number.MAX_VALUE); console.log(1.7976931348623157e30899); // Infinity console.log(1.7976931348623157e30899 + 10); // Infinity console.log(-1.7976931348623157e30899 + 10); // -Infinity console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991 console.log(9007199254740992); // 9007199254740992, 最大安全整数, 保质期 ``` 什么是 NaN > 不是数字, js 解释器想要一个数字, 结果没有得到数字的时候, 就会报 NaN > 除以 0 的问题 ```javascript console.log(1 / 0); // Infinity console.log(-1 / 0); // -Infinity console.log(0 / 0); // NaN ``` 任何涉及 NaN 的操作(例如 NaN /10)都会返回 NaN ```javascript console.log(NaN / 0); // NaN console.log(NaN / NaN); // NaN console.log(100 / 100); // 1 console.log(10 / NaN); // NaN console.log(NaN / 10); // NaN console.log(NaN * 0); // NaN console.log(NaN * NaN); // NaN console.log(10 * NaN); // NaN console.log(NaN * 10); // NaN console.log(Boolean(100 == 100)); // true console.log(Boolean(NaN == NaN)); // false ``` NaN 与任何值都不相等,包括 NaN 本身 ```javascript console.log(Boolean(NaN == NaN)); // false console.log(Boolean(NaN == 10)); // false ``` 数字的强制类型转换 有 3 个函数可以把非数值转换为数值: Number() 、 parseInt() 和 parseFloat() 。 ​ Number() 可以用于任何数据类型 ​ 另两个函数则专门用于把字符串转换成数值。这 3 个 函数对于同样的输入会有返回不同的结果。 Number()规则 ```javascript console.log(Number("123")); // 123 console.log(Number("123.00")); // 123 console.log(Number("00123")); // 123 console.log(Number("0123")); // 123 console.log(Number("123hello")); // NaN console.log(Number([])); // 0 console.log(Number({})); // NaN function hello() {} console.log(Number(hello)); // NaN ``` ```javascript console.log(Number(true)); //1 console.log(Number(false)); //0 ``` 1. 如果是 Boolean 值, true 和 false 将分别被转换为 1 和 0。 1. 如果是数字值,只是简单的传入和返回。 1. 如果是 null 值,返回 0。 1. 如果是 undefined ,返回 NaN 。 ```javascript console.log(Number(123)); // 123 console.log(Number(null)); // 0 console.log(Number(undefined)); // NaN console.log(Number(NaN)); // NaN ``` 1. 如果是字符串,遵循下列规则: 1. 如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即 "1" 会变成 1, "123" 会变成 123,而 "011" 会变成 11(注意:前导的零被忽略了); 1. 如果字符串中包含有效的浮点格式,如 "1.1" ,则将其转换为对应的浮点数值(同样,也会忽略前导零); ```javascript console.log(Number(123.333)); // 123.333 console.log(Number(0.1)); // 0.1 ``` 1. 如果字符串中包含有效的十六进制格式,例如 "0xf" ,则将其转换为相同大小的十进制整数值; ```javascript console.log(Number("0xf")); // 15 console.log(Number("070")); // 70 ``` 1. 如果字符串是空的(不包含任何字符),则将其转换为 0; ```javascript console.log(Number("")); // 0 ``` 1. 如果字符串中包含除上述格式之外的字符,则将其转换为 NaN 。 ```javascript console.log(Number(070)); // 56 console.log(070); // 56 console.log(Number("070")); // 70 console.log(Number("0x70")); // 112 console.log(Number("12.11")); // 12.11 console.log(Number("012.11")); // 12.11 ``` 1. 如果是对象,则调用对象的 valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是 NaN,则调用的对象的 toString()方法,然后再次依照前面的规则转换返回的字符串值。 转整数, 推荐 parseInt() ```javascript console.log(parseInt("0123")); // 123 console.log(parseInt("0.123")); // 0 console.log(parseInt("123hello")); // 123 ``` 转小数, 推荐 parseFloat() ```javascript console.log(parseFloat("0123")); // 123 console.log(parseFloat("0.123")); // 0.123 console.log(parseFloat("123hello")); // 123 console.log(parseFloat("1.00")); // 1 ``` 引号与解析变量 关于转义 > 转变含义 \n 换行 ```javascript var a = "I love \n China"; // I love // China console.log(a); ``` \t 制表 ```javascript var a = "I love\tChina"; var b = "I love China"; console.log(a); // I love China console.log(b); // I love China ``` \b 空格(存在兼容性问题) \r 回车 (windows 里, \r\n 表示一个回车) \\ 斜杠 ```javascript var a = "I love \\China"; console.log(a); // I love \China ``` \' 单引号( ' ),在用单引号表示的字符串中使用。例如: 'He said, \'hey.\'' \" 双引号( " ),在用双引号表示的字符串中使用。 ```javascript var a = "I love China"; var b = "I love 'China'"; var c = 'I love "China"'; var d = 'I love "China"'; console.log(a); // I love China console.log(b); // I love 'China' console.log(c); // I love "China" console.log(d); // I love "China" ``` 获取字符的长度 ```javascript var a = [1, 2, 3]; console.log(a.length); //3 var b = "I love China"; console.log(b.length); // 12 var b = "I love\tChina"; console.log(b.length); // 12 \t当成一个 var c = "I love 'China'"; console.log(c.length); // 14 var d = "I love 'China'"; console.log(d.length); // 14 转义当一个字符 ``` 转字符串 toString(), 几乎每种类型都有, 除了 null 和 undefined ```javascript var a = 123; console.log(typeof a.toString()); // string console.log(a.toString()); // 123 var b = 0xff; console.log(b.toString()); // 255 console.log(typeof b.toString()); // string var c = 070; console.log(c.toString()); // 56 console.log(typeof c.toString()); // string ``` ```javascript var a = null; console.log(a.toString()); var b; console.log(b.toString()); ``` String() 1. 如果值有 toString() 方法,则调用该方法(没有参数)并返回相应的结果; 1. 如果值是 null ,则返回 "null" ; 1. 如果值是 undefined ,则返回 "undefined" 。 ```javascript var a = null; console.log(String(a)); // null console.log(typeof String(a)); // string var b; console.log(String(b)); // undefined console.log(typeof String(b)); // string ``` 第三种方法,+"" ```javascript var a = 123; console.log(typeof (a + "")); // string console.log(123 + "123hello"); // 123123hello ``` ## Object 类型 创建对象和数组的"三种"方式 ```javascript var arr = []; var arr1 = new Array(); var arr2 = new Array(); console.log(typeof arr); // object console.log(typeof arr1); // object console.log(typeof arr2); // object var obj = {}; var obj1 = new Object(); var obj2 = new Object(); console.log(typeof obj); // object console.log(typeof obj1); // object console.log(typeof obj2); // object ``` # 变量作用域 什么是作用域 > 变量的势力范围 某个执行环境中的所有代码执行完毕后,该环境被销毁,保存在其中的所有变量和函数定义也随之销毁 ```javascript var a; function hello() { a = "hello"; } hello(); console.log(a); ``` var 声明局部变量