Skip to content

JavaScript 经典实例

Chap. 1 使用javascript字符串

字符串对象:

var a = 'haha'; //litrals称为直接量
typeof a // => string
var b = new String('haha')
typeof b // => object
  • 条件比较字符串: ===’严格相等运算符 需要比较数据类型,所以上例的字符串直接量和String对象就不会一样

  • 在字符串中查找子字符串: str.indexOf('haha') indexOf方法接受两个参数 子字符串和开始搜索的位置

  • 从一个字符串提取子字符串:

var start = str.indexOf('x');
var end = str.indexOf('xx', start+1);
    • str.splice(插入/删除的起始位置;删除个数;插入的元素) 删除并插入元素,会改变原元素
  • str.slice(start,end(能为负))
  • str.substring(start, end(不能为负));
  • //ps 关于两者的不同可以参考这里

  • str.split(','); => 分割的数组

  • str.substr(字符串开始的索引位置, 字符串的长度) => 依然不改变原字符串 默认截取从当前位置到字符串最后的长度。
var a = 'good job';
a.substr(2) => od job
a.substr(2,2) => oo

所以.substr很适合切一句话的第一个字 str.substr(1);

----附注----

而很适合切一个数组的最后几个值的是array.splice(1)

  • 检查一个存在的非空的字符串: if (( typeof str != 'undefined' && typeof str.valueOf() == 'string' ) && str.length > 0 )
  • 处理textarea的单个行: str.split( '\n' ) //用来即时预览评论的常见技术
  • 去除字符串尾部空白: str.trim() 是js内置方法!~

Chap. 234 关于时间、定时器、数字

  • 创建一个特定的日期(date对象): var dt = new Date(2016-1-2) or new Date(2016, 1, 2, 可以再加小时、分钟…)

  • 获取时间戳: new Date().getTime()/1000;

  • 使用带有定时器的函数闭包:

javascript var intervalId=null; function stopStartElement(){ if (intervalId == null) { intervalId = setInterval(function(){...},1000) } else { clearInterval(intervalId); intervalId=null; } }

  • NaN: 当想要使用一个数字操作中无法解析为数字的一个值的时候,表示not a number

  • 把十进制转换为十六进制: num.toString(16);

  • 随机产生颜色:

javascript function random(val){ return Math.floor(Math.random()*(val+1)); } function randomColor(){ return "rgb(" + randomVal(255) + "," + randomVal(255) + "," randomVal(255) + ")"; }

Chap. 5 数组

  • 排序数组
  • 多维数组扁平化 xx.concat(xx数组,xx数组,xx数组)
  • findIndex(callback) 与 indexOf(value)

Chap. 6 函数

  • 声明式函数 vs 函数直接量

  • 函数只能有一个返回值,若要多个返回值 放在对象里

  • 实现递归算法(斐波那契数列 )

javascript var fibonacci = function() { return n<2 ? n:fibonacci(n-1) + fibonacci(n-2); }

  • 闭包的用法: 创建能够记住其状态的函数

javascript function greeting(when) { function addWho(who) { return 'good' + when + 'to' + who; } return addWho; } var morning = greeting('morning'); //赋值给变量的已经是内部函数了 morning('Jack'); var night = greeting('night'); night('Jack'); //分别创建了两个作用域链

Chap. 7 事件

  • addEventListener基本上各大浏览器都可以用了
  • .keydown事件(传出的第一个参数key 有key.key key.Code 以及最常用的数字key.which)
  • 还有h5拖放事件!已整理至vikkiModule啦!
  • e.target vs e.currentTarget 前者触发后者监听
  • e.isTrusted可以用来分辨是用户触发事件行为(true)还是js触发事件(false)

Chap. 8 浏览器

  • window.navigator(重要属性有userAgent)

  • window.location系列(当然可以直接简写成location 因为最顶级的元素是window)

javascript 比如https://nqdeng.github.io/7-days-nodejs#2.1 location.protocol = 'https:' location.hostname = 'nqdeng.github.io' location.pathname = '/7-days-nodejs' location.hash = '#2.1' ∴ location.href = protocol + '//' + hostname + pathname + hash

  • 动态生成breadcumbTrail(面包屑路径)

  • 单页面 不同锚点 记住状态,以防用户意外刷新

要点:①获取hash:页面打开时检测hash,利用switch,根据hash不同跳转不同阶段 location.hash.split('#')[1]; ②设置hash:跳下一阶段时,location.hash也要相应改变成下一阶段的。 这样相当于“重新看不见地运行至当前状态”

Chap. 11,12 DOM 操作

  • 一段p, 里面有a,如何将a移除且保留a的内容(a的文本节点,还有em或span之类)?亦即:将所有的子节点移除链接

javascript var children = links[i].childNodes; for(var j = 0; j < children.length; j++){ parent.insertBefore(children[j], links[i]); //先将a内的子节点一个个插入到现在的a前 //如果希望保留a里的数据,则写成children[j].cloneNode(true); } parent.removeChild(children[i]); //再删除a

## Chap. 13 确定 Web 页面区域

  • 13.1 web页面的宽高

window.innerWidth/ window.innerHeight

IE9以前: document.body.clientWidth

  • 13.2 度量元素

el.getBoundingClientRect(); 返回一个ClientRect对象,包括top, bottom, right, left还有width和height