1. 20160314知识点的补充:
    a-1:最原始的操作要比函数调用快
  1. <script type="text/javascript">
  2. var min = Math.min(1,6,9,0,3);
  3. alert(min);
  4. var arr = ['23',"A",5];
  5.  
  6. arr[arr.length] = min;
  7. // arr.push(min);
  8. alert(arr);
  9. </script>
  1.  
  1. 1、首次为变量赋值时务必使用var关键字
  2.  
  3. 变量没有声明而直接赋值得话,默认会作为一个新的全局变量,要尽量避免使用全局变量
  4. 2、使用===取代==
  5.  
  6. ==和!=操作符会在需要的情况下自动转换数据类型。但===和!==不会,它们会同时比较值和数据类型,这也使得它们要比==和!=快
  7.  
  8. [10] === 10 // is false
  9. [10] == 10 // is true
  10. '10' == 10 // is true
  11. '10' === 10 // is false
  12. [] == 0 // is true
  13. [] === 0 // is false
  14. '' == false // is true but true == "a" is false
  15. '' === false // is false
  16.  
  17. 3underfinednull0falseNaN、空字符串的逻辑结果均为false
  18. 、行尾使用分号
  19.  
  20. 实践中最好还是使用分号,忘了写也没事,大部分情况下JavaScript解释器都会自动添加。对于为何要使用分号,可参考文章JavaScript中关于分号的真相
  21. 5、使用对象构造器

  22. function Person(firstName, lastName){
  23. this.firstName = firstName;
  24. this.lastName = lastName;
  25. }
  26. var Saad = new Person("Saad", "Mousliki");
  27. 6、小心使用typeofinstanceofcontructor
  28. typeofJavaScript一元操作符,用于以字符串的形式返回变量的原始类型,注意,typeof null也会返回object,大多数的对象类型(数组Array、时间Date等)也会返回object
  29. contructor:内部原型属性,可以通过代码重写
  30. instanceofJavaScript操作符,会在原型链中的构造器中搜索,找到则返回true,否则返回false
  31.  
  32. var arr = ["a", "b", "c"];
  33. typeof arr; // 返回 "object"
  34. arr instanceof Array // true
  35. arr.constructor(); //[]
  36. 、使用自调用函数
  37.  
  38. 函数在创建之后直接自动执行,通常称之为自调用匿名函数(Self-Invoked Anonymous Function)或直接调用函数表达式(Immediately Invoked Function Expression )。
    格式如下:
  39.  
  40. (function(){
  41. // 置于此处的代码将自动执行
  42. })();
  43. (function(a,b){
  44. var result = a+b;
  45. return result;
  46. })(10,20)
  47. 8、从数组中随机获取成员
  48.  
  49. var items = [12, 548 , 'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' , 2145 , 119];
  50. var randomItem = items[Math.floor(Math.random() * items.length)];
  51. 、获取指定范围内的随机数
  52.  
  53. 这个功能在生成测试用的假数据时特别有数,比如介与指定范围内的工资数
  54.  
  55. var x = Math.floor(Math.random() * (max - min + 1)) + min;
  56. 生成从0到指定值的数字数组
  57.  
  58. var numbersArray = [] , max = 100;
  59. for( var i=1; numbersArray.push(i++) < max;); // numbers = [1,2,3 ... 100]
  60. 11、生成随机的字母数字字符串

  61. function generateRandomAlphaNum(len) {
  62. var rdmString = "";
  63. for( ; rdmString.length < len; rdmString += Math.random().toString(36).substr(2));
  64. return rdmString.substr(0, len);
  65. }
  66.  
  67. 12、打乱数字数组的顺序
  68.  
  69. var numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411];
  70. numbers = numbers.sort(function(){ return Math.random() - 0.5});
  71. /* numbers 数组将类似于 [120, 5, 228, -215, 400, 458, -85411, 122205] */
  72.  
  73. 这里使用了JavaScript内置的数组排序函数,更好的办法是用专门的代码来实现(如Fisher-Yates算法),可以参见StackOverFlow上的这个讨论。
  74. 、字符串去空格
  75.  
  76. JavaC#和PHP等语言都实现了专门的字符串去空格函数,但JavaScript中是没有的,可以通过下面的代码来为String对象函数一个trim函数:
  77.  
  78. String.prototype.trim = function(){return this.replace(/^\s+|\s+$/g, "");};
  79.  
  80. 新的JavaScript引擎已经有了trim()的原生实现。
  81. 、数组之间追加
  82.  
  83. var array1 = [12 , "foo" , {name "Joe"} , -2458];
  84. var array2 = ["Doe" , 555 , 100];
  85. <span style="color: #ff0000;">Array.prototype.push.apply(array1, array2);</span>
  86. /* array1 值为 [12 , "foo" , {name "Joe"} , -2458 , "Doe" , 555 , 100] */
  87. 对象转换为数组
  88.  
  89. var argArray = Array.prototype.slice.call(arguments);
  90. 16、验证是否是数字

  91. function isNumber(n){
  92. return !isNaN(parseFloat(n)) && isFinite(n);
  93. }
  94. 17、验证是否是数组

  95. function isArray(obj){
  96. return Object.prototype.toString.call(obj) === '[object Array]' ;
  97. }
  98.  
  99. 但如果toString()方法被重写过得话,就行不通了。也可以使用下面的方法:
  100.  
  101. Array.isArray(obj); // its a new Array method
  102.  
  103. 如果在浏览器中没有使用frame,还可以用instanceof,但如果上下文太复杂,也有可能出错
  104.  
  105. var myFrame = document.createElement('iframe');
  106. document.body.appendChild(myFrame);
  107. var myArray = window.frames[window.frames.length-1].Array;
  108. var arr = new myArray(a,b,10); // [a,b,10]
  109. // myArray 的构造器已经丢失,instanceof 的结果将不正常
  110. // 构造器是不能跨 frame 共享的
  111. arr instanceof Array; // false
  112. 18、获取数组中的最大值和最小值

  113. var numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411];
  114. var maxInNumbers = Math.max.apply(Math, numbers);
  115. var minInNumbers = Math.min.apply(Math, numbers);
  116. 清空数组
  117.  
  118. var myArray = [12 , 222 , 1000 ];
  119. myArray.length = 0; // myArray will be equal to [].
  120. 、不要直接从数组中deleteremove元素

  121. 如果对数组元素直接使用delete,其实并没有删除,只是将元素置为了undefined。数组元素删除应使用splice
  122.  
  123. 切忌:
  124.  
  125. var items = [12, 548 ,'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' ,2154 , 119 ];
  126. items.length; // return 11
  127. delete items[3]; // return true
  128. items.length; // return 11
  129. /* items 结果为 [12, 548, "a", undefined × 1, 5478, "foo", 8852, undefined × 1, "Doe", 2154, 119] */
  130.  
  131. 而应:
  132.  
  133. var items = [12, 548 ,'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' ,2154 , 119 ];
  134. items.length; // return 11
  135. items.splice(3,1) ;
  136. items.length; // return 10
  137. // items 结果为 [12, 548, "a", 5478, "foo", 8852, undefined × 1, "Doe", 2154, 119]
  138.  
  139. 删除对象的属性时可以使用delete
  140. 21、使用length属性截断数组
  141.  
  142. 前面的例子中用length属性清空数组,同样还可用它来截断数组:
  143.  
  144. var myArray = [12 , 222 , 1000 , 124 , 98 , 10 ];
  145. myArray.length = 4; // myArray will be equal to [12 , 222 , 1000 , 124].
  146.  
  147. 与此同时,如果把length属性变大,数组的长度值变会增加,会使用undefined来作为新的元素填充。length是一个可写的属性
  148.  
  149. myArray.length = 10; // the new array length is 10
  150. myArray[myArray.length - 1] ; // undefined
  151. 22、在条件中使用逻辑与或
  152.  
  153. var foo = 10;
  154. foo == 10 && doSomething(); // is the same thing as if (foo == 10) doSomething();
  155. foo == 5 || doSomething(); // is the same thing as if (foo != 5) doSomething();
  156.  
  157. 逻辑或还可用来设置默认值,比如函数参数的默认值
  158.  
  159. function doSomething(arg1){
  160. arg1 = arg1 || 10; // arg1 will have 10 as a default value if it’s not already set
  161. }
  162. 23、使得map()函数方法对数据循环
  163.  
  164. var squares = [1,2,3,4].map(function (val) {
  165. return val * val;
  166. });
  167. // squares will be equal to [1, 4, 9, 16]
  168. 24、保留指定小数位数
  169.  
  170. var num =2.443242342;
  171. num = num.toFixed(4); // num will be equal to 2.4432
  172.  
  173. 注意,toFixec()返回的是字符串,不是数字。
  174. 25、浮点计算的问题
  175.  
  176. 0.1 + 0.2 === 0.3 // is false
  177. 9007199254740992 + 1 // is equal to 9007199254740992
  178. 9007199254740992 + 2 // is equal to 9007199254740994
  179.  
  180. 为什么呢?因为0.1+0.2等于0.30000000000000004JavaScript的数字都遵循IEEE 754标准构建,在内部都是64位浮点小数表示,
    具体可以参见JavaScript中的数字是如何编码的.
  181.  
  182. 可以通过使用toFixed()和toPrecision()来解决这个问题。
  183. 26、通过for-in循环检查对象的属性
  184.  
  185. 下面这样的用法,可以防止迭代的时候进入到对象的原型属性中。
  186.  
  187. for (var name in object) {
  188. if (object.hasOwnProperty(name)) {
  189. // do something with name
  190. }
  191. }
  192. 27、逗号操作符
  193.  
  194. var a = 0;
  195. var b = ( a++, 99 );
  196. console.log(a); // a will be equal to 1
  197. console.log(b); // b is equal to 99
  198. 28、临时存储用于计算和查询的变量

  199. jQuery选择器中,可以临时存储整个DOM元素
  200.  
  201. var navright = document.querySelector('#right');
  202. var navleft = document.querySelector('#left');
  203. var navup = document.querySelector('#up');
  204. var navdown = document.querySelector('#down');
  205. 29、提前检查传入isFinite()的参数
  206.  
  207. isFinite(0/0) ; // false
  208. isFinite("foo"); // false
  209. isFinite("10"); // true
  210. isFinite(10); // true
  211. isFinite(undefined); // false
  212. isFinite(); // false
  213. isFinite(null); // true,这点当特别注意
  214. 30、避免在数组中使用负数做索引
  215.  
  216. var numbersArray = [1,2,3,4,5];
  217. var from = numbersArray.indexOf("foo") ; // from is equal to -1
  218. numbersArray.splice(from,2); // will return [5]
  219.  
  220. 注意传给splice的索引参数不要是负数,当是负数时,会从数组结尾处删除元素
  221. 31、用JSON来序列化与反序列化
  222.  
  223. var person = {name :'Saad', age : 26, department : {ID : 15, name : "R&D"} };
  224. var stringFromPerson = JSON.stringify(person);
  225. /* stringFromPerson 结果为 "{"name":"Saad","age":26,"department":{"ID":15,"name":"R&D"}}" */
  226. var personFromString = JSON.parse(stringFromPerson);
  227. /* personFromString 的值与 person 对象相同 */
  228. 、不要使用eval()或者函数构造器
  229.  
  230. eval()和函数构造器(Function consturctor)的开销较大,每次调用,JavaScript引擎都要将源代码转换为可执行的代码
  231.  
  232. var func1 = new Function(functionCode);
  233. var func2 = eval(functionCode);
  234. 、避免使用with()
  235.  
  236. 使用with()可以把变量加入到全局作用域中,因此,如果有其它的同名变量,一来容易混淆,二来值也会被覆盖。
  237. 34、不要对数组使用for-in
  238.  
  239. 避免:
  240.  
  241. var sum = 0;
  242. for (var i in arrayNumbers) {
  243. sum += arrayNumbers[i];
  244. }
  245.  
  246. 而是:
  247.  
  248. var sum = 0;
  249. for (var i = 0, len = arrayNumbers.length; i < len; i++) {
  250. sum += arrayNumbers[i];
  251. }
  252.  
  253. 另外一个好处是,ilen两个变量是在for循环的第一个声明中,二者只会初始化一次,这要比下面这种写法快:
  254.  
  255. for (var i = 0; i < arrayNumbers.length; i++)
  256. 、传给setInterval()和setTimeout()时使用函数而不是字符串
  257.  
  258. 如果传给setTimeout()和setInterval()一个字符串,他们将会用类似于eval方式进行转换,这肯定会要慢些,因此不要使用:
  259.  
  260. setInterval('doSomethingPeriodically()', 1000);
  261. setTimeout('doSomethingAfterFiveSeconds()', 5000);
  262.  
  263. 而是用:
  264.  
  265. setInterval(doSomethingPeriodically, 1000);
  266. setTimeout(doSomethingAfterFiveSeconds, 5000);
  267. 36、使用switch/case代替一大叠的if/else
  268.  
  269. 当判断有超过两个分支的时候使用switch/case要更快一些,而且也更优雅,更利于代码的组织,当然,如果有超过10个分支,就不要使用switch/case了。
  270. 37、在switch/case中使用数字区间
  271.  
  272. 其实,switch/case中的case条件,还可以这样写:
  273.  
  274. function getCategory(age) {
  275. var category = "";
  276. switch (true) {
  277. case isNaN(age):
  278. category = "not an age";
  279. break;
  280. case (age >= 50):
  281. category = "Old";
  282. break;
  283. case (age <= 20):
  284. category = "Baby";
  285. break;
  286. default:
  287. category = "Young";
  288. break;
  289. };
  290. return category;
  291. }
  292. getCategory(5); // 将返回 "Baby"
  293. 、使用对象作为对象的原型
  294.  
  295. 下面这样,便可以给定对象作为参数,来创建以此为原型的新对象:
  296.  
  297. function clone(object) {
  298. function OneShotConstructor(){};
  299. OneShotConstructor.prototype = object;
  300. return new OneShotConstructor();
  301. }
  302. clone(Array).prototype ; // []
  303. 39HTML字段转换函数
  304.  
  305. function escapeHTML(text) {
  306. var replacements= {"<": "<", ">": ">","&": "&", "\"": """};
  307. return text.replace(/[<>&"]/g, function(character) {
  308. return replacements[character];
  309. });
  310. }
  311. 40、不要在循环内部使用try-catch-finally

  312. try-catch-finallycatch部分在执行时会将异常赋给一个变量,这个变量会被构建成一个运行时作用域内的新的变量。
  313.  
  314. 切忌:
  315.  
  316. var object = ['foo', 'bar'], i;
  317. for (i = 0, len = object.length; i <len; i++) {
  318. try {
  319. // do something that throws an exception
  320. }
  321. catch (e) {
  322. // handle exception
  323. }
  324. }
  325.  
  326. 而应该:
  327.  
  328. var object = ['foo', 'bar'], i;
  329. try {
  330. for (i = 0, len = object.length; i <len; i++) {
  331. // do something that throws an exception
  332. }
  333. }
  334. catch (e) {
  335. // handle exception
  336. }
  337. 、使用XMLHttpRequests时注意设置超时
  338.  
  339. XMLHttpRequests在执行时,当长时间没有响应(如出现网络问题等)时,应该中止掉连接,可以通过setTimeout()来完成这个工作:
  340.  
  341. var xhr = new XMLHttpRequest ();
  342. xhr.onreadystatechange = function () {
  343. if (this.readyState == 4) {
  344. clearTimeout(timeout);
  345. // do something with response data
  346. }
  347. }
  348. var timeout = setTimeout( function () {
  349. xhr.abort(); // call error callback
  350. }, 60*1000 /* timeout after a minute */ );
  351. xhr.open('GET', url, true);
  352. xhr.send();
  353.  
  354. 同时需要注意的是,不要同时发起多个XMLHttpRequests请求。
  355. 、处理WebSocket的超时

  356. 通常情况下,WebSocket连接创建后,如果30秒内没有任何活动,服务器端会对连接进行超时处理,防火墙也可以对单位周期没有活动的连接进行超时处理。
  357.  
  358. 为了防止这种情况的发生,可以每隔一定时间,往服务器发送一条空的消息。可以通过下面这两个函数来实现这个需求,一个用于使连接保持活动状态,
    另一个专门用于结束这个状态
  359.  
  360. var timerID = 0;
  361. function keepAlive() {
  362. var timeout = 15000;
  363. if (webSocket.readyState == webSocket.OPEN) {
  364. webSocket.send('');
  365. }
  366. timerId = setTimeout(keepAlive, timeout);
  367. }
  368. function cancelKeepAlive() {
  369. if (timerId) {
  370. cancelTimeout(timerId);
  371. }
  372. }
  373.  
  374. keepAlive()函数可以放在WebSocket连接的onOpen()方法的最后面,cancelKeepAlive()放在onClose()方法的最末尾。
  375. 、时间注意原始操作符比函数调用快,使用VanillaJS
  376.  
  377. 比如,一般不要这样:
  378.  
  379. var min = Math.min(a,b);
  380. A.push(v);
  381.  
  382. 可以这样来代替:
  383.  
  384. var min = a < b ? a : b;
  385. A[A.length] = v;
  386. 、开发时注意代码结构,上线前检查并压缩JavaScript代码
  387.  
  388. 可以使用JSLintJSMin等工具来检查并压缩代码。
  389. 45JavaScript博大精深,这里有些不错的学习资源

  390. Code Academy资源:http://www.codecademy.com/tracks/javascript
  391. Marjin Haverbekex编写的Eloquent JavaScripthttp://eloquentjavascript.net/
  392. John Resig编写的Advanced JavaScripthttp://ejohn.org/apps/learn/

javaScript 的小技巧的更多相关文章

  1. 你想的到想不到的 javascript 应用小技巧方法

    javascript 在前端应用体验小技巧继续积累. 事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElemen ...

  2. JavaScript 编码小技巧

    三元操作符 如果使用if...else语句,那么这是一个很好节省代码的方式. Longhand: const x = 20; let answer; if (x > 10) { answer = ...

  3. 19 个 JavaScript 编码小技巧

    这篇文章适合任何一位基于JavaScript开发的开发者.我写这篇文章主要涉及JavaScript中一些简写的代码,帮助大家更好理解一些JavaScript的基础.希望这些代码能从不同的角度帮助你更好 ...

  4. JavaScript 转换小技巧

    1.变量转换 看起来很简单,但据我所看到的,使用构造函数,像Array()或者Number()来进行变量转换是常用的做法.始终使用原始数据类型(有时也称为字面量)来转换变量,这种没有任何额外的影响的做 ...

  5. Javascript 编程小技巧总结(部分内容借鉴他人)

    1 – 使用===,而不是== ==(或!=)操作符在需要的时候会自动执行类型转换.===(或!==)操作不会执行任何转换.它将比较值和类型,而且在速度上也被认为优于==. 2 – 使用闭包实现私有变 ...

  6. JavaScript 调试小技巧

    'debugger;' 除了console.log,debugger就是另一个我很喜欢的快速调试的工具,将debugger加入代码之后,Chrome会自动在插入它的地方停止,很像C或者Java里面打断 ...

  7. 22条常用JavaScript开发小技巧

    1.使用var声明变量 如果给一个没有声明的变量赋值,默认会作为一个全局变量(即使在函数内赋值).要尽量避免不必要的全局变量. 2.行尾使用分号 虽然JavaScript允许省略行尾的分号,但是有时不 ...

  8. JavaScript调试小技巧

    1.‘debugger;’ 除了console.log,debugger就是另一个我很喜欢的快速调试的工具,将debugger加入代码之后,Chrome会自动在插入它的地方停止,很像C或者Java里面 ...

  9. JavaScript使用小技巧

    原文:45 Useful JavaScript Tips, Tricks and Best Practices作者:Saad Mousliki 在这篇文章里,我将分享一些JavaScript的技巧.秘 ...

  10. 实用的 JavaScript 调试小技巧

    ‘debugger;’ 除了console.log,debugger就是另一个我很喜欢的快速调试的工具,将debugger加入代码之后,Chrome会自动在插入它的地方停止,很像C或者Java里面打断 ...

随机推荐

  1. mac os中的一些快捷键使用及基础软件安装

    mac os中terminal标签页的切换 Command+Shift+{} { 切换到左边的标签页 }  切换到右边的标签页 普通键盘对应于mac下的按键: CTRL->CONTROL WIN ...

  2. Chrome扩展之css used 获取网页样式

    地址栏输入: chrome://extensions/ 然后获取更多扩展程序,得到css used 复制html节点 最后点击 "css used" 把样式全部复制下来即可 (记住 ...

  3. k8s中的dns服务发现

    一.dns服务 1.解决的问题 为了通过服务的名字在集群内进行服务相互访问,需要创建一个dns服务 2.k8s中使用的虚拟dns服务是skydns 二.搭建 1.创建并应用skydns-rc.yaml ...

  4. 算法笔记_162:算法提高 复数归一化(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 编写函数Normalize,将复数归一化,即若复数为a+bi,归一化结果为a/sqrt(a*a+b*b) + i*b/sqrt(a*a+b*b) . ...

  5. LoadRunner监控Tomcat的几种方法

    通过JConsole监控Tomcat 1.打开tomcat5的bin目录中的catalina.bat文件,在头部注释部分的后面加上: set JAVA_OPTS=%JAVA_OPTS% -Dcom.s ...

  6. CentOS 6.4 编译安装 gcc 4.8.1(转)

    今天在isocpp上看到“GCC 4.8.1 released, C++11 feature complete”这个消息,非常兴奋.终于有一个全面支持C++11语言特性的编译器了! 当然了,gcc仅仅 ...

  7. java new map

    import com.google.common.collect.Maps; public static Map<String, Object> configMap2 = new Conc ...

  8. 【DB2】不同编码格式下的汉字所占字节

    UTF-8 (8-bit Unicode Transformation Format) 是一种针对Unicode的可变长度字符编码,又称万国码,它包含全世界所有国家需要用到的字符,是国际编码,通用性强 ...

  9. ubuntu14.04使用root用户登录桌面,ubuntu14.04root 转

    ubuntu安装好之后,默认是不能用root用户登录桌面的,只能使用普通用户或者访客登录.怎样开启root用户登录桌面呢? 先用普通用户登录,然后切换到root用户,然后执行如下命令: vi /usr ...

  10. 【PHP】(原创)之表单FORM的formhash校验,以TP3.2示例

    1.目的:每次表单POST提交(ajax的POST也适用)过来数据,都必须校验formhash参数是否和服务器端的一致,不一致说明重复提交或者 跨站攻击提交csrf 2.原理:参照了 KPPW 的fo ...