JS框架设计读书笔记之-小知识
这一篇写一点小知识
JS中0.1+0.2为什么不等于0.3?
关于这个问题之前也很疑虑,老师也只是笼统的讲这是JS的语言问题,但是内部具体的情况却没有讲,看了书才发现原理如此简单。
简单来讲,计算机识别的数字长度是有限制的,过大的数字计算会出现infinity或者NAN,这个好理解,但是为什么小数也会出现呢?如果从二进制的角度思考就很简单了,对于一定范围内的正数,总是可以表示成对应的二进制,但是小数就有问题了,十进制的0.5相当于热二进制的0.1,0.25 => 0.01,0.125 => 0.001,0.0625 => 0.0001...那么问题来了,0.1和0.2是多少?从这个规律来看,大概是0.01-0.001与0.001-0.0001的一个数,而且肯定是一个无限循环的数字。前面讲了,数字长度是有限的,碰到这种无限长的,只能从中间砍掉,比如0.1在二进制是0.0001100110011...的循环,可能在某个部位就砍掉了,丢失后面的循环;同理,0.2也被砍掉了,导致的结果就是被砍掉后的0.3000...004
new操作符做了什么?
1. 创建了一个空对象
2. instance.__proto__ = constructor.prototype
3. 将构造函数里面的 this => instance
4. 执行construtor里面的代码
5. 判定构造函数是否有返回值,没有返回默认为undefined,如果返回复合数据类型,直接返回,否则返回this
如何判断浏览器类型
// 判断是否在浏览器环境
var inBrowser = typeof window !== 'undefined';
// window.navigator.userAgent => 获取浏览器信息
// Google Chrome返回下列字符串
// Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
// IE8返回下列字符串
// Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; InfoPath.3)
var UA = inBrowser && window.navigator.userAgent.toLowerCase(); // IE
var isIE = UA && /msie|trident/.test(UA);
// IE9
var isIE9 = UA && UA.indexOf('msie 9.0') > 0;
// edge
var isEdge = UA && UA.indexOf('edge/') > 0;
// android
var isAndroid = UA && UA.indexOf('android') > 0;
// IOS
var isIOS = UA && /iphone|ipad|ipod|ios/.test(UA);
Object.creat(null)
Object.create(null)会生成一种叫纯空对象的东西,没有toString、valueOf,什么都没有,在Object.prototype被污染或极需节省内存的情况下有用。
关于Object.preventExtensions/Object.seal/Object.freeze
Object.preventExtensions
1. 阻止添加本地属性
2. 可以删除本地属性
3. 可以修改本地属性
4. 可以添加原型属性
Object.seal
1. 阻止添加本地属性
2. 允许修改本地属性
3. 不允许删除本地属性,内部实现是遍历属性,并将configurable改为false
Object.freeze
改都不可以了~
兼容问题
getElementById:IE6,IE7下会选取到name属性
[].slice.call():IE6-IE8下无法切割NodeList,即DOM节点集合
getElementByTagName:IE6-IE8会混杂注释节点
getElementByName:只能选取表单元素
关于querySelectorAll
该方法返回一个StaticNodelist对象,而常规的方法返回的是NodeList。
具体区别看下面代码就明白了。
var tag = 'getElementsByTagName',
query = 'querySelectorAll';
console.log(document[tag]('div') == document[tag]('div')); //true
console.log(document[query]('div') == document[query]('div')); //false
简单来讲,querySelectorAll每次都返回一个不一样的Object,而tag方法会从缓存中取。因此,普通方法要比querySelectorAll快上10倍以上。
另外,还有一个问题,IE8下,对StaticNodelist对象取不存在的下标不会返回undefined,而是抛出一个异常,这样的话while(len--){...}这样的表达式就不好使了。
JS框架设计读书笔记之-小知识的更多相关文章
- JS框架设计读书笔记之-节点模块
节点的创建 浏览器提供了多种手段创建API,从流行程度依次是document.createElement.innerHTML.insertAdjacentHTML.createContextualFr ...
- JS框架设计读书笔记之-核心模块
随笔记录一下读书心得 1. 框架模块-核心模块 该模块是框架最先执行的部分,jQuery与vue中都有初始化的代码. 模块的功能主要是:对象扩展.数组化.类型判定.事件绑定和解绑.无冲突处理.模块加载 ...
- JS框架设计读书笔记之-动画
基础概念 CSS样式可分为两种,一种值接近无限的集合(color,width),一种值只有几种(display),可以进行计算的样式,产生了动画效果.\ 1. 动画的第一步是获得元素的精确样式值. 2 ...
- JS框架设计读书笔记之-选择器引擎01
选择符 选择符是指CSS样式规则最左边的部分,例如 p{},#id{},.class{},p.class{} 等等 总共可以分为四大类: 并联选择器 => 逗号 => $('div,spa ...
- JS框架设计读书笔记之-异步
setTimeout/setInterval 1. 如果回调执行时间大于间隔时间,真正的间隔时间会大一些. 2. 存在一个最小的时间间隔,即使seTimeout(fn,0),在IE6-IE8中大概为1 ...
- JS框架设计读书笔记之-选择器引擎02
选择器引擎涉及相关概念 概念 以Sizzle的主函数声明为例,来说明引擎的相关概念. function Sizzle(selector, context, results, seed) { //... ...
- JS框架设计读书笔记之-函数
这次写一些函数 1.模拟Object.keys方法 Object.keys = Object.keys || function(obj){ var a = []; // a[0],a[1]...分别赋 ...
- javascript框架设计(读书笔记)
我觉得多看几本进阶的书 与其十本书读一遍,不如一本书读十遍 读书的启示: 读好书(看推荐) 精读(重复看) 能读厚书(javascript权威指南) Object.keys Object.keys=O ...
- js框架设计1.1命名空间笔记
借到了司徒正美的写的js框架设计一书,司徒大神所著有些看不太懂,果然尚需循序渐进,稳扎js基础之中. 第一张开篇司徒阐述了种子模块的概念 种子模块亦为核心模块,框架最先执行模块,司徒见解应包含:对象扩 ...
随机推荐
- XML预览
功能: 实现模板文件的预览 模板实体类中有一个content字段,它的值是xml形式的,就是要预览它的内容; 实现思路: 在java后台中将这个xml内容以xml文件的形式保存到服务器上,然后将路 ...
- Flask-WTF CSRF 保护P3
使用FlaskForm处理请求的任何视图函数都已经获得了CSRF保护.如果有些视图函数还在使用FlaskForm或AJAX请求,请尽快使用FlaskForm提供的CSRF扩展来保护它们. 导入 想要为 ...
- kettle的HTTPPOST控件发送WSDL的webservice请求配置
1.webservice请求的URL:http://pubservice.rjhn.com.cn/AppserviceTest/JsonWcfService.svc?WSDL 2.使用SOAPUI测试 ...
- java GUI编程一
一.AWT介绍 所有的可以显示出来的图形元素都称为Component,Component代表了所有的可见的图形元素,Component里面有一种比较特殊的图形元素叫Container,Containe ...
- JAVA多线程---高并发程序设计
先行发生原则 程序顺序原则:一个线程内保证语义的串行性 volatile:volatile变量的写,先发生于读,这保证了volatile变量的可见性 锁规则:解锁必然发生在随后的加锁前 传递性:A优先 ...
- 接口interface,接口继承implements
php中,只支持从一个类继承,不支持从两个或者更多的类同时继承.从两个或者两个以上的类继承的能力被称为多重继承.php在设计上是禁止这种功能的.原因在于,避免多个类带来的复杂性.当发现需要从两个或者更 ...
- TETeLasr Cutting System 开机回零问题
TETeLasr Cutting System 开机回零问题 :打开 "轴信息" :打开 加工参数-->机器参数-->脉冲当量: X轴==4000 Y轴== ...
- Java 中的语法糖
百度百科对语法糖的定义 语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这 ...
- Python文件读写模式
r 打开只读文件,该文件必须存在. r+ 打开可读写的文件,该文件必须存在.可读,可写,可追加. w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失.若文件不存在则建立该文件. w+ 打 ...
- 使用SQLite做本地数据缓存的思考
前言 在一个分布式缓存遍地都是的环境下,还讲本地缓存,感觉有点out了啊!可能大家看到标题,就没有想继续看下去的欲望了吧.但是,本地缓存的重要性也是有的! 本地缓存相比分布式缓存确实是比较out和比较 ...