一、对象

1.1 获取属性值的方式


water = {
down: false
}
console.log(water.down) // false
console.log(water['down']) // false

1.2 获取动态生成的属性的值


var type = 'down'
console.log(water[type]) // false

二、数组

2.1 检测是否为数组


typeof([1,2]) // object
Array.isArray([1,2]) // true
Object.prototype.toString.call([1,2]) // [object Array]
Array.isArray(Array.prototype) // true
Object.prototype.toString.call(Array.prototype) // [object Array]

2.2 增加数组长度导致未赋值的位置为undefined

减少数组长度则会裁去多余的值。


var x = [1,2];
x.length = 7;
console.log(x); // [1, 2, undefined × 5]
x.length = 1;
console.log(x); // [1]

2.3 用闭包实现简易迭代器


var next = setup([3,3,9]);
function setup(x){
var i = 0;
return function(){
console.log(x[i++]);
}
}
next(); // 3
next(); // 3
next(); // 9
next(); // undefined

三、作用域

3.1 函数作用域(局部变量)

不能在函数体外直接访问函数内变量。


function water() {
var direction = 'down'
}
console.log(direction) // Uncaught ReferenceError: direction is not defined

3.2 不存在块级作用域

for、if等代码块中的变量不是局部变量。


if(water){
var down = true
}
console.log(down) // true

3.3 变量泄露

函数体内的变量未声明,会在函数第一次执行的时候泄露成全局变量。


function water() {
direction = 'down'
}
water() // 执行函数
console.log(direction) // down

3.4 变量提升

已声明的变量名会提升至顶部,值不会提升。


var down = true
function water() {
// 变量提升覆盖了外部down,由于值没有提升,所以为undefined
console.log(down) // undefined
var down = false // false
console.log(down)
}
water()

3.5 临时作用域


call和apply借用另一个对象的方法,提高代码复用
第一个参数为this的指向,第二个参数为传入的参数,apply传入数组
构造函数不使用new this的值会指向window

四、闭包

4.1 操作闭包中的值


var nature = (function() {
var water = {}
water.down = false
water.get = function(type) {
return water[type]
}
water.set = function(type,val) {
water[type] = val
return typeof(val) === 'boolean' ? true : false
}
return {
getWater: water.get,
setWater: water.set
}
})()
console.log(nature.getWater('down')) // false
console.log(nature.setWater('down',true)) // true

五、事件监听


var event = {
add: function ( dom,type,func ) {
if(window.addEventListener){
dom.addEventListener( type,func,false )
}
// 兼容IE9以下
else if(document.attachEvent) {
dom.attachEvent('on' + type,func)
}
else {
dom['on' + type] = func
}
},
del: function ( dom,type,func ) {
if(window.addEventListener){
dom.removeEventListener( type,func,false )
}
else if(document.attachEvent) {
dom.detachEvent('on' + type,func)
}
else {
dom['on' + type] = null
}
}
}
var f = function(){
console.log('event received')
}
event.add(document.body,'click',f)
event.del(document.body,'click',f)

六、类型检测

6.1 常用类型


typeof(1) // "number" number/boolean/string/undefined/object/function

6.2 继承检测


function Water (name,status) {
this.name = name
this.status = status
}
var seaWater = new Water('sea','warm')
seaWater instanceof Water // true

6.3 NaN和isFinite检测

NaN不等于NaN,检测需要使用isNaN函数。

NaN === NaN  // false
isNaN(NaN) // true

七、类型转换

7.1 转为整形

parseInt和parseFloat碰到第一个异常字符就会终止。


console.log(parseInt(66.5t)) // 66.5
console.log(parseInt(t66.5t)) // NaN

7.2 null和undefined

数值超出范围则显示Infinity。


console.log(1*undefined) // NaN
console.log(1*null) // 0

八、URL编码

8.1 编码


var src = "http://www.cnblogs.com/bergwhite/p/6657943.html"
var srcURI = encodeURI(src) // "http://www.cnblogs.com/bergwhite/p/6657943.html"
var srcURICom = encodeURIComponent(src) // "http%3A%2F%2Fwww.cnblogs.com%2Fbergwhite%2Fp%2F6657943.html"

8.2 解码


decodeURI(srcURI) // "http://www.cnblogs.com/bergwhite/p/6657943.html"
decodeURIComponent(srcURI) // "http://www.cnblogs.com/bergwhite/p/6657943.html"

九、JSON格式

9.1 转为JSON格式


var water = {
down: false
}
var waterJSON = JSON.stringify(water) // "{"down":false}"

9.2 转为对象


JSON.parse(waterJSON) // Object {down: false}

十、兼容性问题


parseInt(09) // ES5中默认不转换八进制,ES3会默认作为八进制
parseInt(09,10) // 当值为日期的时候,作为十进制处理

感谢大家的阅读。

一、基本类型

1.1 字符串

判断是否包含某个字符串

indexOf方法中,找到相关字符串会返回第一次出现的下标。没有找到就会返回-1,利用这个特性可以判断字符串是否存在。


console.log('Fine'.indexOf('in') !== -1) // true

把字符串按照一定规则分离成数组

下面是以空格为分割标志。


console.log('I seek you'.split(' ')) // ["I", "seek", "you"]

复制指定位置的字符串

传入的两个参数分别是开始的位置和结束的标记。看清楚,第二个参数本身的小标所表示的内容不会被复制,第二个参数是用来标记,这里是结束位置。


console.log('I seek you'.slice(2,6)) // seek
console.log('I seek you'.substring(2,6)) // seek

拼接字符串


console.log('I seek you'.concat(' too.')) // I seek you too.

查看字符串中的字符


console.log('I seek you'[0]) // I
console.log('I seek you'.charAt(0)) // I

1.2 对象

判断属性是自己的还是继承来的

使用in不能判断属性是自己的还是继承来的,使用hasOwnProperty可以。


var xiaoming = {
name: 'xiaoming'
}
使用in不能判断属性是自己的还是继承来的
---------------------------------
'name' in xiaoming // true
'toString' in xiaoming // true
---------------------------------
xiaoming.hasOwnProperty('name') // true
xiaoming.hasOwnProperty('toString') // false

判断对象是否可枚举


xiaoming.propertyIsEnumerable() // false

判断对象是另一个对象的原型


var People = function (name) {
this.name = name
}
var xiaoming = new People('xiaoming') Human.prototype = monkey
monkey.isPrototypeOf(man)

1.3 原型

  • __proto__是实例对象的属性
  • prototype是构造函数的属性
  • constructor指向构造函数

IE中不存在__proto__,推荐使用ES5的Object.getPropertyOf()访问。


typeof [].__proto__ // "object"
Object.getPrototypeOf([]) // [constructor: function, toString: function, toLocaleString: function, join: function, pop: function…]
[].constructor.prototype

原型继承


var People = function (name,age) {
this.name = name
this.age = age
}
xiaoming = People.prototype
xiaoming.constructor = xiaoming

1.4 常用数学方法


Math.PI // 3.141592653589793
Math.SQRT2 // 1.4142135623730951
Math.sqrt(2) // 1.4142135623730951
Math.E // 2.718281828459045
Math.pow(2,3) // 8
Math.random() * (10-2)+2 // 7.564475903879611 | 2-8之间的平均数
Math.LN2 // 0.6931471805599453
Math.floor(2.6) // 2 | 指定值的最小整数
Math.ceil(2.6) // 3 | 指定值最大整数
Math.round(2.6) // 3 | 去最靠近指定值的整数
Math.max() // 3
Math.min() // 2
Math.sin(90) // 0.8939966636005579
Math.cos(90) // -0.4480736161291702

二、DOM操作

2.1 节点编号、名称以及值

nodeType有12种,具体请见MDN


<div class="you">HELLO YOU</div> var you = document.getElementsByClassName('you')[0]
you.nodeType // 1
you.nodeName // BIV
you.nodeValue // null
you.textContent // HELLO YOU
you.innerText // "HELLO YOU"

2.2 父节点、子节点和相邻节点

检查是否具有某个子节点


document.documentElement.hasChildNodes('body') // true

查看所有子节点


document.documentElement.childNodes // [head, text, body]

查看第一个子节点


document.documentElement.firstChild // <head>...</head>

访问父节点


document.documentElement.childNodes[0].parentNode

访问相邻节点


document.documentElement.children[0].previousSibling // null
document.documentElement.children[0].nextSibling // #text

2.3 添加和删除节点


<div class="you">HELLO YOU</div> var you = document.getElementsByClassName('you')[0]

新建节点


var pTag = document.createElement('p')
var pVal = document.createTextNode('HELLO YOU')
pTag.appendChild(pVal) // <p>HELLO YOU</p>

添加节点


document.body.insertBefore(pTag,you)
document.body.replaceChild(you,pTag)

删除节点


document.body.removeChild(you)

克隆节点

true为深拷贝,会拷贝节点的内容。flase只拷贝空标签。


var newNodeFalse = document.body.cloneNode(true)
var newNodeFalse = document.body.cloneNode(false)
console.log(newNodeFalse) // <body>...</body>
console.log(newNodeFalse) // <body></body>

2.4 属性相关


<div class="you">HELLO YOU</div> var you = document.getElementsByClassName('you')[0]

检查是否具有某个属性


you.hasAttributes('class') // true

获取具体属性


you.getAttribute('class') // "you"
you.attributes[0].nodeValue // "you"
you.attributes['class'].nodeValue // "you"

选择器

querySelector使用的是CSS选择器,返回单个节点。返回所有匹配的结果用querySelectorAll。


document.querySelector('.you')
document.querySelectorAll('.you') // [div.you]

批量添加样式


you.style.cssText = "color:red;font-size:200px;"

2.5 DOM合集


document.images
document.applets
document.links
document.anchors
document.forms
document.cookie
document.title
document.referrer
document.domain

2.6 DOM遍历


function walkDOM(n){
do {
console.log(n)
if(n.hasChildNodes()){
walkDOM(n.firstChild)
}
}
while (n=n.nextSibling)
}
walkDOM(document.body)

三、其他

3.1 事件

阻止冒泡


event.stopPropagation()
window.event.cancelBubble = true //IE

阻止默认事件


event.preventDefault()
return false // IE

拖动事件

MDN在线示例

触屏事件

这里有一个用canva实现的画图页面,触屏画图,实现过程可以直接看源码。。另外触屏事件的分析,请见伯乐在线


touchstart
touchmove
touchend
touchleave
touchcancel

3.2 浏览器检测

用户代理可以被模拟,所以根据浏览器的不同特征来检测当前浏览器类型更加可靠。


if(window.addEventlistener) {
// code...
}
else if(){
// code...
}

3.3 三种弹窗方式

三种弹窗分别是提示框(alert),确认框(confirm)和交互框(prompt)。可以把确认和交互赋值给变量,变量会存储相应结果。


alert('Welcome To JS!')
var isLike = confirm('Do you like JS?')
var whyLike = prompt('Why do you like it.')
console.log(isLike) // true
console.log(whyLike) // Maybe...

3.4 根据浏览器历史控制前进后退

根据缓存的浏览器历史,可以控制前进、后退和跳转到指定历史记录。


window.history.forward() // 前进
window.history.back() // 后退
window.history.go(1) // 跳转

3.5 重载页面的六种方式


location.reload()
location.assign('/')
location.replace('/')
window.location.href = '/'
location = location
window.location.reload()

3.6 修改当前页面URL但是不刷新页面


history.pushState({a:1},'','hello')

3.7 URI编码


function decodeURI(url,params){
var url = url || 'http://www.cnblogs.com/bergwhite/'
var params = params || {name: 'berg', age: 22}
var query = []
for (param in params) {
query.push(param+'='+params[param])
}
return url+=query.join('&')
}
decodeURI() // "http://www.cnblogs.com/bergwhite/name=berg&age=22"
decodeURI('http://www.you.com/',{a:1,b:2}) // "http://www.you.com/a=1&b=2"

3.8 窗口相关

新窗口打开内容


window.open('http://www.baidu.com','zzzzzzzzzzzz','width=800px,height=300px,resizable=yes')

判断是否是高分辨率屏幕


window.devicePixelRatio // 1

感谢您的阅读。

JavaScript面向对象编程指南(第2版)》读书笔记的更多相关文章

  1. 《JavaScript面向对象编程指南(第2版)》读书笔记(一)

    目录 一.对象 1.1 获取属性值的方式 1.2 获取动态生成的属性的值 二.数组 2.1 检测是否为数组 2.2 增加数组长度导致未赋值的位置为undefined 2.3 用闭包实现简易迭代器 三. ...

  2. 《JavaScript面向对象编程指南(第2版)》读书笔记(二)

    <JavaScript面向对象编程指南(第2版)>读书笔记(一) <JavaScript面向对象编程指南(第2版)>读书笔记(二) 目录 一.基本类型 1.1 字符串 1.2 ...

  3. 《JavaScript面向对象编程指南》读书笔记②

    概述 <JavaScript面向对象编程指南>读书笔记① 这里只记录一下我看JavaScript面向对象编程指南记录下的一些东西.那些简单的知识我没有记录,我只记录几个容易遗漏的或者精彩的 ...

  4. 《JavaScript面向对象编程指南》读书笔记①

    概述 JavaScript快忘完了,想看一本专业书拾遗,所以看了这本<JavaScript面向对象编程指南>. 个人觉得这本书讲的很透彻很易懂,一些原来有疑惑的地方在这本书里面豁然开朗,看 ...

  5. 闭包初体验 -《JavaScript面向对象编程指南》

    下面是我对闭包的理解:(把他们整理出来,整理的过程也是在梳理) 参考<JavaScript面向对象编程指南> 1.首先,在理解闭包之前: 我们首先应该清楚下作用域和作用域链 作用域:每个函 ...

  6. [已读]JavaScript面向对象编程指南

    又是一个忽悠人的书名,其实这本书的花了大量内容阐述JS的基础语法,BOM,DOM,事件,ajax(这个和很多js书一样).最后一章则是编程模式与设计模式. 我觉得与面向对象没多大关系,要算的话,pro ...

  7. 《JavaScript面向对象编程指南》译者序

    相对于Perl.Python等动态脚本语言来说,JavaScript确实是一门饱受误解的语言.对于译者这种从20世纪90年代末走过来的C++程序员来说,尤其如此.在那个年代,提起JavaScript总 ...

  8. 《JavaScript面向对象编程指南》

    第一章.引言 1.5 面向对象的程序设计常用概念 对象(名词):是指"事物"在程序设计语言中的表现形式. 这里的事物可以是任何东西,我们可以看到它们具有某些明确特征,能执行某些动作 ...

  9. js_读【javascript面向对象编程指南】笔记

    写在前面: 工欲善其事,必先利其器.编程的器,是前人总结的经验,常言道站在巨人的肩膀上开发,往往比自己另辟蹊径容易的多.经验藏于书,故有书中自有颜如玉,书中自有黄金屋,我也一度认为读书要花费很多时间, ...

随机推荐

  1. Idea安装Scala插件(转)

    原文链接:http://blog.csdn.net/a2011480169/article/details/52712421 参考博客: 1.http://wwwlouxuemingcom.blog. ...

  2. 如何将qlv格式的腾讯视频转换为mp4格式

    一般来说,每个视频网站都会有自己的视频播放格式,如优酷的KUX.爱奇艺的QSV和腾讯的QLV等. 但是大家知道,优酷是有转码功能的,而就目前来说腾讯视频还没有转码功能,下面是将qlv格式的腾讯视频转换 ...

  3. effective c++读书笔记(一)

    很早之前就听过这本书,找工作之前读一读.看了几页,个人感觉实在是生涩难懂,非常不符合中国人的思维方式.之前也有博主做过笔记,我来补充一些自己的理解. 我看有人记了笔记,还不错:http://www.3 ...

  4. CSS&&xpath

    1.元素选择器 <div class="wrap"> 直接选择文档元素div 2.类选择器 <div class="wrap"> 元素的 ...

  5. C++如何取得int型的最大最小值

    转:http://www.cnblogs.com/alex4814/archive/2011/09/12/2174173.html 當題目涉及到求最大最小值時,最初的比較數字就應當設置爲INT_MAX ...

  6. 向SD卡写入树莓派的操作系统

    这是 meelo 原创的 玩转树莓派 系列文章 用到的工具: Win32 Disk Imager: sd卡读卡器  Raspbian操作系统镜像:下载地址 步骤1:下载操作系统的镜像 树莓派基金会的网 ...

  7. 快速开发window服务器程序

    import service; service.startDispatchThread( 服务名 = function(serviceName,argv){ import service; var s ...

  8. Typecho-反序列化漏洞学习

    目录 Typecho-反序列化漏洞学习 0x00 前言 0x01 分析过程 0x02 调试 0x03 总结 0xFF 参考 Typecho-反序列化漏洞学习 0x00 前言 补丁: https://g ...

  9. lr11 controller打开提示cannot initialize driver dll,exiting

    解决:在win7要以管理员身份运行才行的 问题2:在使用loadrunner时,从vuser generator启动controller的时候可能出现:由于另一个程序正在运行中 此操作无法完成.请选择 ...

  10. 十 使用dict和set

    dict Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度. 举个例子,假设要根据同学的名字 ...