JavaScript编码习惯和技巧
运用 || 和&&运算符
1 | var foo = 10; |
运用 | 运算符
在js整数操作的时候,相当于去除小数点(取整),parseInt。在正数的时候相当于Math.floor(),负数的时候相当于Math.ceil() [REF]
1 | Math.ceil() 用作向上取整。 |
同理有:
1 | n<<0 |
用map遍历处理数组
1 | var squares = [1,2,3,4].map(function (val) { |
浮点数处理
1 | var num = 2.443242342; |
1 | 0.1 + 0.2 === 0.3 // is false, 0.30000000000000004 instead. |
用'==='而不是'=='
1 | [10] === 10 // is false |
有趣的现象: "" == "0" 且 0 == "0",但是 "" == 0 为false,当然这是js隐式转换的问题
布尔型转换
通过使用 否 操作符两次,可以把一个值转换为布尔型。
1 | !!'foo'; // true |
用switch处理判断(true/false)
1 | function getCategory(age) { |
尽量用原生表达式而不是函数调用
1 | var min = Math.min(a,b); |
数组连接
1 | var vegetables = ['parsnip', 'potato']; |
将arguments转换为数组
1 | var argArray = Array.prototype.slice.call(arguments); |
判断是否为数组
1 | function isArray(obj){ |
判断是否为数字
1 | function isNumber(n){ |
打散字符串为单个字符(数组)
1 | str.split(''); |
创建自调用函数
1 | (function(){ |
随机获取数组中元素
1 | var items = [12, 548 , 'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' , 2145 , 119]; |
生成固定范围内的数组
1 | var numbersArray = [], max = 100; |
打乱数组顺序
1 | var numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411]; |
取得数组中最大或最小值
1 | var numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411]; |
不要用delete删除数组中的元素
1 | var items = [12, 548 ,'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' ,2154 , 119 ]; |
缩减数组
1 | var myArray = [12 , 222 , 1000 , 124 , 98 , 10 ]; |
去除字符串前后空白
1 | //如果浏览器本身不支持String对象的trim方法,那么运行下面的代码可以兼容这些环境. |
注意区分布尔值true/false 与 布尔对象的值true/false
1 | var b = new Boolean(false); |
[闭包]利用闭包模拟私有方法
1 | var makeCounter = function() { |
数组排序函数
1 | list.sort(function(a, b) { |
将数组所有项累加
1 | var total = [0, 1, 2, 3].reduce(function(a, b) { |
数组扁平化
1 | var flattened = [[0, 1], [2, 3], [4, 5]].reduce(function(a, b) { |
点击其他(空白)地方执行操作,如关闭等
1 | $(document).on('click', function(e){ |
复制对象
1 | Object.prototype.clone = function(){ |
Firefox下设置或获取scrollTop需特定写法
1 | function getScrollXY(){ |
时间
1 | //获取时间数值 |
关闭打开窗口
1 | var browserName = navigator.appName; |
Sibling elements
1 | // jQuery |
Iframe Contents
1 | // jQuery |
Get style
1 | // jQuery |
DOM - remove
1 | // jQuery |
创建重复字符串
1 | var count = 3; |
& (按位与)
1 | // 判断一个数是否为2的n次幂,可以将其与自身减一相与 |
^ (按位异或)
1 | // 不用第三个变量,就可以交换两个变量的值 |
Object.prototype.toString()
在toString()方法被调用时,会执行下面的操作步骤:
如果this的值为undefined,则返回"[object Undefined]". 如果this的值为null,则返回"[object Null]". 让O成为调用ToObject(this)的结果. 让class成为O的内部属性[[Class]]的值. 返回三个字符串"[object ", class, 以及 "]"连接后的新字符串.
由于 JavaScript 中一切都是对象,任何都不例外,对所有值类型应用Object.prototype.toString.call()
方法结果如下:
1 | console.log(Object.prototype.toString.call(123)); //[object Number] |
所有类型都会得到不同的字符串,几乎完美。 在JavaScript中,想要判断某个对象值属于哪种内置类型,最靠谱的做法就是通过 Object.prototype.toString() 方法.
判断对象是否为空对象,即不包含任何原始属性
1 | function isEmpty(obj){ |
显示网页所有元素轮廓
控制台中输入:
1 | [].forEach.call($$("*"),function(a){ a.style.outline="1px solid #"+(~~(Math.random()*(1<<24))).toString(16) }) |
利用a标签自动解析URL
1 | function parseURL(url) { |
参考: Parsing URLs with the DOM!
利用toString()方法生成随机字符串
1 | function generateRandomAlphaNum(len) { |
禁止别人以iframe加载你的页面
1 | if (window.location != window.parent.location) window.parent.location = window.location; |
参考
45 useful javascript tips tricks and best practices You Don't Need jQuery JavaScript 秘密花园 盘点JavaScript里好用的原生API ꒰・◡・๑꒱ 关于原生js的一些研究


