首页 文章 精选 留言 我的

精选列表

搜索[javascript引擎],共10000篇文章
优秀的个人博客,低调大师

Javascript:npm模块安装机制简介

正因为有了npm,我们只要一行命令,就能安装别人写好的模块 。 $ npm install 1 本文介绍 npm 模块安装机制的细节,以及如何解决安装速度慢的问题。 一、从npm install说起 npm install 命令用来安装模块到node_modules目录。 $ npm install <packageName> 1 安装之前,npm install会先检查,node_modules目录之中是否已经存在指定模块。如果存在,就不再重新安装了,即使远程仓库已经有了一个新版本,也是如此。 如果你希望,一个模块不管是否安装过,npm 都要强制重新安装,可以使用-f或–force参数。 $ npm install <packageName> --force 1 二、npm update 如果想更新已安装模块,就要用到npm update命令。 $ npm update <packageName> 1 它会先到远程仓库查询最新版本,然后查询本地版本。如果本地版本不存在,或者远程版本较新,就会安装。 三、registrynpm update命令怎么知道每个模块的最新版本呢? 答案是 npm 模块仓库提供了一个查询服务,叫做 registry 。以 npmjs.org 为例,它的查询服务网址是https://registry.npmjs.org/。 这个网址后面跟上模块名,就会得到一个 JSON 对象,里面是该模块所有版本的信息。比如,访问https://registry.npmjs.org/react,就会看到 react 模块所有版本的信息。 它跟下面命令的效果是一样的。 $ npm view react # npm view 的别名 $ npm info react $ npm show react $ npm v react 1 2 3 4 5 registry 网址的模块名后面,还可以跟上版本号或者标签,用来查询某个具体版本的信息。比如, 访问https://registry.npmjs.org/react/v0.14.6,就可以看到 React 的 0.14.6 版。 返回的 JSON 对象里面,有一个dist.tarball属性,是该版本压缩包的网址。 dist: { shasum: '2a57c2cf8747b483759ad8de0fa47fb0c5cf5c6a', tarball: 'http://registry.npmjs.org/react/-/react-0.14.6.tgz' }, 1 2 3 4 到这个网址下载压缩包,在本地解压,就得到了模块的源码。npm install和npm update命令,都是通过这种方式安装模块的。 四、缓存目录npm install或npm update命令,从 registry 下载压缩包之后,都存放在本地的缓存目录。 这个缓存目录,在 Linux 或 Mac 默认是用户主目录下的.npm目录,在 Windows 默认是%AppData%/npm-cache。通过配置命令,可以查看这个目录的具体位置。 $ npm config get cache $HOME/.npm 1 2 你最好浏览一下这个目录。 $ ls ~/.npm # 或者 $ npm cache ls 1 2 3 你会看到里面存放着大量的模块,储存结构是{cache}/{name}/{version}。 $ npm cache ls react ~/.npm/react/react/0.14.6/ ~/.npm/react/react/0.14.6/package.tgz ~/.npm/react/react/0.14.6/package/ ~/.npm/react/react/0.14.6/package/package.json 1 2 3 4 5 每个模块的每个版本,都有一个自己的子目录,里面是代码的压缩包package.tgz文件,以及一个描述文件package/package.json。 除此之外,还会生成一个{cache}/{hostname}/{path}/.cache.json文件。比如,从 npm 官方仓库下载 react 模块的时候,就会生成registry.npmjs.org/react/.cache.json文件。 这个文件保存的是,所有版本的信息,以及该模块最近修改的时间和最新一次请求时服务器返回的 ETag 。 { "time":{ "modified":"2016-01-06T23:52:45.571Z", // ... }, "_etag":"\"7S37I0775YLURCFIO8N85FO0F\"" } 1 2 3 4 5 6 7 对于一些不是很关键的操作(比如npm search或npm view),npm会先查看.cache.json里面的模块最近更新时间,跟当前时间的差距,是不是在可接受的范围之内。如果是的,就不再向远程仓库发出请求,而是直接返回.cache.json的数据。 .npm目录保存着大量文件,清空它的命令如下。 $ rm -rf ~/.npm/* # 或者 $ npm cache clean 1 2 3 五、模块的安装过程 总结一下,Node模块的安装过程是这样的。 发出npm install命令 npm 向 registry 查询模块压缩包的网址 下载压缩包,存放在~/.npm目录 解压压缩包到当前项目的node_modules目录 注意,一个模块安装以后,本地其实保存了两份。一份是~/.npm目录下的压缩包,另一份是node_modules目录下解压后的代码。 但是,运行npm install的时候,只会检查node_modules目录,而不会检查~/.npm目录。也就是说,如果一个模块在~/.npm下有压缩包,但是没有安装在node_modules目录中,npm 依然会从远程仓库下载一次新的压缩包。 这种行为固然可以保证总是取得最新的代码,但有时并不是我们想要的。最大的问题是,它会极大地影响安装速度。即使某个模块的压缩包就在缓存目录中,也要去远程仓库下载,这怎么可能不慢呢? 另外,有些场合没有网络(比如飞机上),但是你想安装的模块,明明就在缓存目录之中,这时也无法安装。 六、–cache-min 参数 为了解决这些问题,npm 提供了一个--cache-min参数,用于从缓存目录安装模块。 --cache-min参数指定一个时间(单位为分钟),只有超过这个时间的模块,才会从 registry 下载。 $ npm install --cache-min 9999999 <package-name> 1 上面命令指定,只有超过999999分钟的模块,才从 registry 下载。实际上就是指定,所有模块都从缓存安装,这样就大大加快了下载速度。 它还有另一种写法。 $ npm install --cache-min Infinity <package-name> 1 但是,这并不等于离线模式,这时仍然需要网络连接。因为现在的--cache-min实现有一些问题。 (1)如果指定模块不在缓存目录,那么 npm 会连接 registry,下载最新版本。这没有问题,但是如果指定模块在缓存目录之中,npm 也会连接 registry,发出指定模块的 etag ,服务器返回状态码304,表示不需要重新下载压缩包。 (2)如果某个模块已经在缓存之中,但是版本低于要求,npm会直接报错,而不是去 registry 下载最新版本。 1 2 3 npm 团队知道存在这些问题,正在重写 cache。并且,将来会提供一个--offline参数,使得 npm 可以在离线情况下使用。 不过,这些改进没有日程表。所以,当前使用--cache-min改进安装速度,是有问题的。 七、离线安装的解决方案 社区已经为npm的离线使用,提出了几种解决方案。它们可以大大加快模块安装的速度。 解决方案大致分成三类。 第一类,Registry 代理。 npm-proxy-cache local-npm(用法) npm-lazy 1 2 3 上面三个模块的用法很类似,都是在本机起一个 Registry 服务,所有npm install命令都要通过这个服务代理。 # npm-proxy-cache $ npm --proxy http://localhost:8080 \ --https-proxy http://localhost:8080 \ --strict-ssl false \ install # local-npm $ npm set registry http://127.0.0.1:5080 # npm-lazy $ npm --registry http://localhost:8080/ install socket.io 1 2 3 4 5 6 7 8 9 10 11 有了本机的Registry服务,就能完全实现缓存安装,可以实现离线使用。 第二类,npm install替代。 如果能够改变npm install的行为,就能实现缓存安装。npm-cache工具就是这个思路。凡是使用npm install的地方,都可以使用npm-cache替代。 $ npm-cache install 1 第三类,node_modules作为缓存目录。 这个方案的思路是,不使用.npm缓存,而是使用项目的node_modules目录作为缓存。 Freightnpmbox 上面两个工具,都能将项目的node_modules目录打成一个压缩包,以后安装的时候,就从这个压缩包之中取出文件。 原文发布时间:2018-6-19 原文作者: 阮一峰 本文来源csdn博客如需转载请紧急联系作者

优秀的个人博客,低调大师

Javascript 开启浏览器全屏模式

通常在某些情况下,我们需要让浏览器开启全屏模式,以便获得更好的视觉体验,先看下全屏模式简单的几个API。 浏览器默认绑定 非全屏模式下, document的F11按键绑定开启全屏模式 全屏模式下, document的esc和F11 按键绑定关闭全屏模式 屏幕全屏模式改变事件 当成功进入全屏模式后, document会收到一个fullscreenchange 事件。 当退出全屏状态后, document又会收到fullscreenchange 事件。 varscreenChange='webkitfullscreenchange'||'mozfullscreenchange'||'fullscreenchange' 判断当前是否处于全屏状态 非标准: varisFullScreen=document.fullScreen||document.mozFullScreen||document.webkitIsFullScreen; 标准: varisFullScreen=document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement 开启全屏模式 functionlaunchFullScreen(element){ if(element.requestFullscreen){ element.requestFullscreen(); }elseif(element.mozRequestFullScreen){ element.mozRequestFullScreen(); }elseif(element.webkitRequestFullscreen){ element.webkitRequestFullscreen(); }elseif(element.msRequestFullscreen){ element.msRequestFullscreen(); } } 注意:requestFullscreen是规范的书写模式( s是小写), 但在Gecko内核中仍使用带前缀的大写模式mozRequestFullScreen。 关闭全屏模式 functionexitFullscreen(){ if(document.exitFullscreen){ document.exitFullscreen(); }elseif(document.mozCancelFullScreen){ document.mozCancelFullScreen(); }elseif(document.webkitExitFullscreen){ document.webkitExitFullscreen(); } 全屏模式只能由手势触发 了解API后,假如我们监听window.onload事件执行launchFullScreen方法,Chrome浏览器会提示“开启全屏模式API只能由用户手势触发”。 "Failed to execute 'requestFullScreen' on 'Element': API can only be initiated by a user gesture." 原因是浏览器采用安全的机制, 将这种强制全屏模式意为“恶意行为”,一切非用户主观意愿带来的变化都是不允许的。 因此如果你的应用有全屏需求,有两种方案。 1.页面初始化给用户一个“F11开启全屏” 的提示, 并且在延迟几秒之后消失。 2.页面设置一个全屏按钮,单击全屏按钮进入全屏模式,并且隐藏按钮(视觉效果最佳)。 对于第二种方案,需要监听键盘事件: document.addEventListener("keydown",function(e){ varcurrKey=0 //在FireFox或Opera中,隐藏的变量e是存在的,那么e||event返回e,如果在IE中,隐藏变量e是不存在,则返回event。 vare=e||event; //IE中,只有keyCode属性,而FireFox中有which和charCode属性,Opera中有keyCode和which属性 varcurrKey=e.keyCode||e.which||e.charCode; if(currKey==112){ launchFullScreen(); } },false); 具备了兼容各种浏览器按键模式的监听,但不知道keycode肿么办,112是哪个键? 字母和数字键的键码值(keyCode) 按键 键码 按键 键码 按键 键码 按键 键码 A 65 J 74 S 83 1 49 B 66 K 75 T 84 2 50 C 67 L 76 U 85 3 51 D 68 M 77 V 86 4 52 E 69 N 78 W 87 5 53 F 70 O 79 X 88 6 54 G 71 P 80 Y 89 7 55 H 72 Q 81 Z 90 8 56 I 73 R 82 0 48 9 57 数字键盘上的键的键码值(keyCode) 按键 键码 按键 键码 0 96 8 104 1 97 9 105 2 98 * 106 3 99 + 107 4 100 Enter 108 5 101 – 109 6 102 . 110 7 103 / 111 功能键键码值(keyCode) 按键 键码 按键 键码 F1 112 F7 118 F2 113 F8 119 F3 114 F9 120 F4 115 F10 121 F5 116 F11 122 F6 117 F12 123 控制键键码值(keyCode) 按键 键码 按键 键码 按键 键码 按键 键码 BackSpace 8 Esc 27 Right Arrow 39 -_ 189 Tab 9 Spacebar 32 Dw Arrow 40 .> 190 Clear 12 Page Up 33 Insert 45 /? 191 Enter 13 Page Down 34 Delete 46 `~ 192 Shift 16 End 35 Num Lock 144 [{ 219 Control 17 Home 36 ;: 186 \ 220 Alt 18 Left Arrow 37 =+ 187 ]} 221 Cape Lock 20 Up Arrow 38 ,< 188 ‘“ 222 避免使用非标准化的方法 非标准化的方法指的是进入草案前浏览器实现的一些方法,避免使用。window.fullScreen(Firefox)HTMLMediaElement.webkitDisplayingFullscreenHTMLMediaElement.webkitEnterFullscreenHTMLMediaElement.webkitExitFullscreenHTMLMediaElement.webkitSupportsFullscreen 原文发布时间:2018-6-19 原文作者:伯乐在线 本文来源csdn博客如需转载请紧急联系作者

优秀的个人博客,低调大师

JavaScript 基础 --- (数据类型/循环/条件)

一、js 输出1.window.alert() 警告框 2.document.write() 写到 HTML 文档中 3.innerHTML 写到 HTML 元素 4.console.log() 写到浏览器的控制台 二、js 语句与注释 1. ; (var a = 1;) ;表示语句的结尾 2. 语句标识符:var / if / for 等 3.注释:单行 // 多行 /* */三、数据类型 1.未定义 (undefined) var x; //x 为 undefined(表示变量不含有值) 2.数字 (Number) var y = 5; //y 为数字 3.字符串 (String) var z = "John" // z为字符串 4.布尔 (Boolean) var a = true; //a 为 布尔类型 5.对象 (Object) var person ={firstname:"John",lastname:"Doe",id:5566}; 取值:console.log(person.firstname) console.log(person["firstname"]) 6.数组 (Array) 6-1. var cars = new Array(); //此时 cars 数组的长度为 0 cars[0] = "Saab"; //此时 cars 数组的长度为 1 ,js 数组是动态变化的,即第一个数赋值为 Saab car[1] = "Volvo"; //即第二个数赋值为 Volvo car[1] = "BMW"; //即第三个数赋值为 BMW 6-2. var cars = new Array("Saab","Volvo","bmw") ; 6-3. var cars = ["Saab"."Volvo","BMW"]; 7.空 (Null) var b = null //b为 null(可以用来清空变量) 四、js 变量 1.变量必须以字母开头,(不推荐 $ 和 _)区分大小写 五、js 函数 函数:是由事件驱动的或者当它被调用时执行的可重复使用的代码块 定义方法:1.function a(参数){ } 声明会前置 输出: hello world 输出: hello world 2. var a = function(参数){} 匿名函数 输出:这是一个匿名函数 输出: 1 2 3 (传递参数) return 输出: 六、js 比较与逻辑运算符 1. < 小于 > 大于 2.== 等于(5=="5") === 绝对等于(值和类型均相等 5===5) != 不等于 3.&& 与 || 或 !非 七、js 条件语句 if else if 输出: switch 输出:1 八、js 循环语句 for 输出: for in(循环遍历对象) 输出: while(指定条件为 true 时循环指定的代码块) 输出: break (跳出整个循环) 输出: continue(跳出本次循环) 输出:

优秀的个人博客,低调大师

ES6 javascript 实用开发技巧

ES6 实用开发技巧 本文只罗列出在 ES6 开发过程中相对实用的内容,而非一个高大全的文档,如果希望查阅详细的内容,可购买阮一峰老师所出版的 ES6 相关图书。 定义变量/常量 ES6 中新增加了 let 和 const 两个命令,let 用于定义变量,const 用于定义常量 两个命令与原有的 var 命令所不同的地方在于,let, const 都是块级作用域,其有效范围仅在代码块中,实例如下: //es5 if(1==1){ var b = 'foo'; } console.log(b);//foo //es6 if(1==1){ let b = 'foo'; } console.log(b);//undefined (b is not defined) 定义常量对象 const a = {a:1,b:2}; a.b = 3; console.log(a);//{a:1,b:3} 上例中,常量 a 中的内容在定义后,再进行修改依然有效,原因是对于对象类型的使用是指针式引用,常量只是指向了对象的指针,对象本身的内容却依然可以被修改,注意,数组(Array) 也是对象; 那么如果在定义常量时使用基础数据类型:string, number, boolean 等 const a = 1; a = 2;// Uncaught TypeError: Assignment to constant variable. 在使用中,建议使用 let 与 const 完全代替 var 命令 数值扩展 转换 Number.parseInt - 将字符串或数字转换为整数 Number.parseFloat - 将字符串或数字转换为浮点数 Number.parseInt, Number.parseFloat 与 parseInt, parseFloat 功能一致,在ES6中,推荐使用 Number. 的方式进行调用,这么做的目的是为了让代码的使用方式尽可能减少全局性方法,使用得语言逐步模块化 测试函数 //测试是否整数 Number.isInteger(21)//true Number.isInteger(1.11)//false //测试是否NaN Number.isNaN(Nan)//true Number.isNaN(1)//false 字符串扩展 字符串内容测试 'abcdef'.includes('c');//true 'abcdef'.includes('ye');//false 'abcdef'.startsWith('a');//true 'abcdef'.endsWitch('f');//true //includes(), startsWith(), endsWith() 都支持第二个参数, //类型为数字类型,意为从第 n 个字符开始,endsWith()的第二个参数有点不一样 'abcdef'.includes('c', 4);//false 从第5个字符开始查找是否有 'c' 这个字符 'abcdef'.startsWith('d', 3);//true 从第4个字符开始查找是否是以 'd' 字符为开头 'abcdef'.endsWith('d', 4);//true 前面的4个字符里,是否以 'd' 字符为结尾 字符串内容重复输出 'a'.repeat(5);//aaaaa 重复输出5遍 原生支持模板语言 //es5 $('#result').append( 'There are <b>' + basket.count + '</b> ' + 'items in your basket, ' + '<em>' + basket.onSale + '</em> are on sale!' ); //es6 //在es6中,内容模板,可以定义在 `` 包起来的字符串中,其中的内容会保持原有格式 //另外可以在字符串中直接使用模板语言进行变量填充,优雅而简洁 $('#result').append(` There are <b>${basket.count}</b> items in your basket, <em>${basket.onSale}</em> are on sale! `); 字符串遍历输出 //for ...of 格式为 es6 中的 Iterator 迭代器的输出方式 for(let c of 'abc'){ console.log(c); } //a //b //c 字符串补全 //参数1:[number] 目标字符串长度 //参数2:[string] 进行补全的字符串 '12345'.padStart(7, '0')//0012345 - 字符串不足7位,在头部补充不足长度的目标字符串 '12345'.padEnd(7, '0')//1234500 - 在尾部进行字符串补全 数组扩展 合并数组 let a = [1, 2]; let b = [3]; let c = [2, 4]; let d = [...a, ...b, ...c];//[1, 2, 3, 2, 4] 所有内容合并,但并不会去除重复 快速转换为数组 Array.of(3,4,5)//[3,4,5] 数组内容测试 //判断对象是否为数组 if(Array.isArray(obj)){...} [1,2,3].includes(5);//false,检索数据中是否有5 //找出第一个匹配表达式的结果,注意是只要匹配到一项,函数即会返回 let a = [1, 3, -4, 10].find(function(value, index, arr){ return value < 0; }); console.log(a);//-4 //找出第一个匹配表达式的结果下标 let a = [1, 3, -4, 10].findIndex(function(value, index, arr){ return value < 0; }); console.log(a);//2 内容过滤 //排除负数内容 let a = [1, 3, -4, 10].filter(function(item){ return item > 0; }); console.log(a);//[1, 3, 10] 内容实例 .keys() - 获得数组中所有元素的键名(实际上就是下标索引号) .values() - 获得数组中所有元素的数据 .entries() - 获得数组中所有数据的键名和数据 for (let index of ['a', 'b'].keys()) { console.log(index); } // 0 // 1 for (let elem of ['a', 'b'].values()) { console.log(elem); } // 'a' // 'b' for (let [index, elem] of ['a', 'b'].entries()) { console.log(index, elem); } // 0 "a" // 1 "b" .entries(), .keys(), .values() 功能与 Object 中的几个同名函数功能类似,实际使用中实用性不高,对于数组的操作,直接进行遍历即可 对象扩展 属性的简洁表示 //直接使用变量/常量的名称个为对象属性的名称 let a = 'abc'; let b = {a};//{a: 'abc'} function f(x, y){ return {x, y};} //等效于 function f(x, y){ return {x: x, y: y}} let o = { f(){ return 1; } } //等效于 let o = { f: function(){ return 1; } } 对象内容合并 let a = {a:1,b:2}, b = {b:3}, c = {b:4,c:5}; let d = Object.assign(a, b, c); console.log(d);//{a:1,b:4,c:5} console.log(a);//{a:1,b:4,c:5} //上面的合并方式会同时更新 a 对象的内容,a 的属性如果有多次合并会被更新数据, //参数列中的对象只会影响第一个,后面的参数对象不会被修改数据 //推荐使用这种方式进行对象数据合并 let a = {a:1,b:2}, b = {b:3}, c = {b:4,c:5}; let d = Object.assign({}, a, b, c);//第一个参数增加一个空对象,在合并时让它被更新,不影响实际的对象变量内容 console.log(d);//{a:1,b:4,c:5}//与上面的方式合并结果一致,使用这种方式, a 对象的内容就不会被影响了 对象内容合并的方向是从参数顺序的后向前合并 对象内容集合 Object.keys() - 获得对象中所有的键名,以数组的形式返回 var obj = { a:1,b:2 }; var names = Object.keys(obj);//['a', 'b'] Object.values() - 获得对象中所有的值内容,以数组的形式返回 var obj = { a:1,b:2 }; var values = Object.values(obj);//[1, 2] Object.entries() - 获得对象中所有的成员数据,以数组的形式返回,成员的内容也是数组形式 var obj = { a:1,b:2 }; var values = Object.entries(obj);//[['a',1], ['b',2]] 其实观察可发现,Object.keys(), Object.values(), Object.entries(),与 Java 的 MAP 中的方法是一致的,不论是方法名还是具体的用法,这也可以帮忙理解这些功能 API 对象内容测试 //判断对象是否为数组对象 if(Object.isArray(someobj)){} //判断目标对象是否为空对象 if(someobj && Object.keys(someobj).length) 解构赋值 let [a, b, c] = [1, 2, 3]; //定义了三个变量,并对应赋了值;如果值的个数与变量名个数不匹配,没有对应上的变量值为 undefined let [a, b, c='default'] = [1, 2]; //指定默认值,在定义变量时就指定了默认值,如果赋值时,没有给定内容,则会取默认值 let [a, …b] = [1,2,3]; //这里 b 的值为[2,3],这样可以快速使用剩余的数据赋值给变量, //但实际使用中为了避免代码阅读的歧义,不推荐这么使用,仅作了解即可 let [a,b,c] = 'yes'; console.log(a);//y console.log(b);//e console.log(c);//s 字符串的解构赋值会以单个字符的方式进行赋值 let {length}='yes'; console.log(length);//3 以对象赋值的方式,如果名称是字符串的自带属性,则会获得属性值 let arr = [1,2]; let obj = {a:1,b:2}; function test ({a = 10, b}){ console.log('a:',a); console.log('b:',b); } test(obj); 解构赋值的使用实例,作为函数传参,并使用默认值 对象结构解构 let obj = {a: 1, b: 2}; let {a, b} = obj;//a=1,b=2 使用变量的方式进行结构赋值,需要严格匹配名称,数组的模式是严格匹配下标 let obj = {a: 1, b: 2}; let {a=0, b=5} = obj; 赋值并给定默认值 let obj = {a: 1, b: 2}; let {a:A, b} = obj;//A=1,b=2,a报错,变量未定义 获得内容后,将变量进行改名 let obj = {a: 1, b: 2}; let a = 0; ({a, b} = obj); 对已存在的 a 进行修改值,并生成新的变量 b let obj = { arr: ['aaa',{a:1}] }; let {arr:[b, {a}]} = obj;//这里的arr互相映射 console.log(b); console.log(a); 获得对象的子数据,并映射到相应的变量,这里需要注意的是结构要对应 模块化 最简单实例的使用场景 //a.js let a = {a:1,b:2,c:3}; export default a; //b.js import a from 'a.js';//假设 a.js 与 b.js 同在一个目录中 console.log(a.a);//1 以上简单的实例就两个脚本文件举例说明了两个文件在实际使用,可以进行互相引用,并获得目标文件中的数据;我们可以认为一个脚本文件就是一个 模块,那么在实际开发过程中,可以将业务处理内容,或是数据处理过程 抽象在一个文件中,在需要使用时,由其它模块引入并使用其中的数据 箭头函数 箭头函数的基本语法 (参数1, 参数2, …, 参数N) => { 函数声明 } (参数1, 参数2, …, 参数N) => 表达式(单一) //相当于:(参数1, 参数2, …, 参数N) =>{ return 表达式; } // 当只有一个参数时,圆括号是可选的: (单一参数) => {函数声明} 单一参数 => {函数声明} // 没有参数的函数应该写成一对圆括号。 () => {函数声明} //箭头函数的内容不能用于构造函数,即声明的内容,不能通过 new 一个对象来使用 看一个简单的例子 let count = function(num){ return num + 1; }; //使用箭头函数重构 let count = num => num + 1; 上面的例子在重构后,给人最直观的感受就是 function 关键字 {}、() 和 return 等关键字不再需要书写,对于简单的函数体,可简化不少代码 let count = num => { let base = 50; let step = 10; return base + step + 1; }; 在函数体一行代码不能完成时,就不能省略 {} 和 return 关键字 //多个入参 let count = (num, step) => num + step + 1; //没有入参 let count = () => 3.1415926; 当入参不止一个或是没有入参时,需使用小括号包裹 返回一个对象 //错误,会报 SyntaxError let count = num => { base: 50, total: num + 100 }; //正常返回对象 let count = num => ({ base: 50, total: num + 100 }); 封闭上下文的 this 通过上面的例子可以看得出,箭头函数很像匿名函数((function(args){...}(val))),但又不完全一样,主要的区别在于 this 的使用结果 let goods = { price: 5, total: function(quantity){ console.log(this.price);//5 - this 指向了 goods 对象 let calc = function(){ return quantity * this.price;//这里的 this 指向了window } return calc(); } }; console.log(goods.total(5));//Nan 上面的例子当然可以使用传参或在函数外定义一个变量 that 来接收外部的 this(即函数内第一句),并在函数内部使用 that 来解决问题,但这不在当前话题的讨论范围内 let goods = { price: 5, total: function(quantity){ console.log(this.price);//5 - this 指向了 goods 对象 let calc = () => quantity * this.price; //这里的 this 同样指向了goods对象 return calc(); } }; console.log(goods.total(5));//25 总结箭头函数的特点就是 更短的函数 和 封闭上下文的 this,也许更短的函数才是我们使用最多的地方 原文发布时间:04/12 原文作者:TerryZ 本文来源开源中国如需转载请紧急联系作者

优秀的个人博客,低调大师

JavaScript 原始数据类型转换

Js基础数据类型有7种: 原始数据类型(6种) number (数值) string (字符串) boolean (布尔) null (空对象, typeof 检测为object) undefine(未定义) symbol (符号类型) 对象数据类型(1种) object(对象类型) 补充: NaN表示 not a number; function本质为 object, 但由于其特殊的地位, typeof会检测为 function; symbol 为ECMAScript6 新定义的数据类型, 符号类型是唯一的并且是不可修改的, 并且也可以用来作为Object的key的值 转换为字符串 .toString() 无法将null, undefine转为字符串 String() 可以将null, undefine转为字符串 // 变量已经被赋值 console.log("变量已经被赋值的情况:"); (function test01(){ var name = "zhaozhao"; console.log(String(name)) console.log(name.toString()) })(); // 变量没有被赋值 console.log("变量没有被赋值的情况:"); (function test02(){ var name; console.log(String(name)) console.log(name.toString()) })(); 运行结果 转换为数值 parseInt()强转为整数 // 强转为整数 console.log("====") console.log(parseInt("100")); // 100 console.log(parseInt("100zhaozhao")); // 100 console.log(parseInt("zhaozhao100")); // NaN console.log(parseInt("100zhaozhao100")); // 100 console.log(parseInt("100.18zhaozhao")); // 100 parseFloat()转为浮点数(不会把整数转换为浮点数) // 转为浮点数(不会把整数转换为浮点数) console.log("====") console.log(parseFloat("100")); // 100 console.log(parseFloat("100zhaozhao")); // 100 console.log(parseFloat("zhaozhao100")); // NaN console.log(parseFloat("100zhaozhao100")); // 100 console.log(parseFloat("100.18")); // 100.18 console.log(parseFloat("100.18zhaozhao")); // 100.18 Number()转换为数值, 较严格 // 转换为数值 console.log("====") console.log(Number("100")); // 100 console.log(Number("100zhaozhao")); // NaN console.log(Number("zhaozhao100")); // NaN console.log(Number("100zhaozhao100")); // NaN console.log(Number("100.18")); // 100.18 console.log(Number("100.18zhaozhao")); // NaN 运行结果 转换为布尔 // 布尔类型的转换 // 除零以外的数字, 非空字符串 都为 true console.log(Boolean(1)) console.log(Boolean(-1)) console.log(Boolean("哈哈")) // 0 ,空字符串, null, undefined都为false console.log("====") console.log(Boolean(0)) console.log(Boolean("")) console.log(Boolean(null)) console.log(Boolean(undefined)) 转换为布尔 快速获取boolean值的小技巧: 在变量前添加2个!,示例!!("zhaozhao") === true; 和 !!("") === false 快速获取boolean Chrome控制台字体大小控制: - 字体变大: command + +- 字体变小: command + - (windows把command转为ctrl即可)

资源下载

更多资源
Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册