Javascript J更深层次的理解avascript 基础知识
eval全局函数
var eval_ = new Function('return eval(arguments[0]);'); //Function 函数是在顶级作用域下执行, 但执行效率更慢, 但使用这样的方法不会污染全局变量。而且调用的是顶级作用域
eval('var i =100;');
alert(i); // 100
eval_('var b = 100');
//alert(b); //错误, b 未定义 var where = '我在国外'; //全局作用域的where
function test() {
var where = '我在国内'; //闭包的where
eval_('alert(where)'); //我在国外, 全局作用域
eval('alert(where)');//我在国内, 局部全用域
window.eval('alert(where)'); //我在国外 IE6/7/8 我在国内。不会採用全局作用域。 能够使用execScript
}
test()
(Function("d", "d.eval = function(){return d.global.eval ? d.global.eval(arguments[0]) : eval(arguments[0]);}"))(dojo);
/*=====
dojo.eval = function(scriptText){ // 尝试在全局作用域下运行角本字符串(scriptText), 除了IE不能支持,其他浏览器都能够正确的在全局作用域下运行, IE下运行
dojo.eval('var pi = 3.14');
alert(pi) //pi undefined;
要在IE中运行全局变量
dojo.eval("window.pi = 3.14"); IE 下要运行全局变量, 仅仅能使用execScript, 可是它不会返回值。 而且不能终止运行
*/
对像的属性检測与枚举
- in 操作符 , 假设对象的自有属性或者继承属性有包括被检測的属性, 则返回ture, "toString" in { x: 'hello'} //true;
- hasOwnProperty() 检測给定的名字是否为对像的自有属性,假设是,返回true, 对于继承属性,返回false;
- propertyIsEnumerable() 是hasOwnProperty的增强版, 检測自有属性。 而且可枚举
- for/in 枚举对像的属性的可枚举属性包括(自有属性和继承属性),不枚举内置方法("toString" )。 但自已重写的内置方法,可被枚举
- toString, toLocaleString, valueOf 等内置属性不可枚举, Object.prototype.propertyIsEnumerable('toString') 返回true, 但对于代码定义的toString方法。是可枚举的(大部分自已定义的属性都可枚举), 但在IE6之前。自已又一次定义的内置方法,还是不可枚举. 能够通过下面代码进行调整
/*
定义一个扩展函数。用来将第二个以及之后的參数。 拷贝到第一个參数
但在IE下,有一个bug, 就是对于自已定义的内置方法(如在第二个參数对像里有定义toString方法, 那么IE6下for/in不会枚举到toString方法。也就不会复制这个自己定义方法
所以在代码的里须要显示的检測它
多个对像时,參数右则的属性等级更高
*/
var extend = (function(){ for(var p in {toString:null}){
return function(o){
for(var i = 1, len = arguments.length; i < len; i++){
var source = arguments[i];
for(var prop in source) o[prop] = source[prop];
}
return o;
}
}
// IE 6
var protoprops = ['toString', 'toLocaleString', 'valueOf', 'hasOwnProperty', 'isPrototypeOf', 'constructor', 'propertyIsEnumerable'];
return function(o){
for(var i = 1, len = arguments.length; i < len; i++){
var source = arguments[i];
for(var prop in source) o[prop] = source[prop];
for(var j = 0; j < protoprops.legnth; j++){
prop = protoprops[j];
if(source.hasOwnProperty(prop)) o[prop] = source[prop];
}
}
return o;
} })()
isString 等方法的实现
/*
著名大师 Douglas Crockford 的实现方法
但对于 instaceof 有一个局限。 instaceof 在两个页面,如A 页面定义了isString方法, 那么能过<iframe name='bPage'> 框架,载入的 B 页面,并定义 var test = new String('test')
window.onload = function(){
isString(window.bPage.test); // false;
}
*/
function isString(i){
return typeof i === 'string' || i instanceof String; // instanceof 用于检測 new String() 创建的字符串
}
/*
有一个小缺点:假设其他的库又一次定义了继承的String类,那么会返回 [object Object], 而上面的方法能够检測到这个是一字符串
*/
function isString(i){
return {}.toString.call(i) === "[object String]";
}
toArray 方法的实现, IE8 下有差别
efficient = function(obj, offset, startWith){
console.log('efficient');
return (startWith || []).concat(Array.prototype.slice.call(obj, offset||0))
}
_toArray = parseInt(window.navigator.appVersion.split('MSIE ')[1]) <= 8 ? (function(){
function slow(obj, offset, startWith){
var arr = startWith||[];
for(var x = offset || 0; x < obj.length; x++){
arr.push(obj[x]);
}
return arr;
}
return function(obj){
return ((obj.item) ? slow : efficient).apply(this, arguments); //假设仅仅决断是否为IE, has(ie), 那么IE9以上的浏览器也会调用slow方法。效率就慢了
};
})() : efficient
window.onload = function(){ var input = document.getElementsByTagName('input') _toArray(input)[0].value = '12'; //IE8及下面的浏览器, 不支持obj对像为非javascript对像
}
for 循环里的 i++ 与 ++i
异或(^)的使用
function everyOrSome(some){
var every = !some;
return function(a, fn, o){
var i = 0, l = a && a.length || 0, result;
if(l && typeof a == "string") a = a.split("");
if(typeof fn == "string") fn = cache[fn] || buildFn(fn);
if(o){
for(; i < l; ++i){
result = !fn.call(o, a[i], i, a); //一定要加!运算符。转换为boolean类型
if(some ^ result){<span style="white-space:pre"> </span>//some 设置为true, 当遇到一个false时,直接返回true; every 即some取反。 every = false, 当遇到fn计算结果为false, 取反后为 true, 那么 false ^ true 为 true, 那么返回 !true.
return !result;
}
}
}else{
for(; i < l; ++i){
result = !fn(a[i], i, a);
if(some ^ result){
return !result;
}
}
}
return every; // Boolean
};
}
数组length的相关问题
function A(){}
A.prototype=new Array();
var a=new A();
m.push('a','b','c');
alert(a);//IE6 7:0 其它:3
alert(a[2]);//全部浏览器:'c', 当使用原型继承数组时。IE 6 7下length会始终为0,不管你有多少个元素,其它浏览器则正常。
选择器的兼容性
对querySelectorAll的思考
<div><p id="foo"><span><i><i></span></p></div>
<script src="//ajax.googleapis.com/ajax/libs/dojo/1.10.0/dojo/dojo.js"></script>
<script>
var foo = document.getElementById("foo");
// should return nothing
alert( dojo.query('div span', foo).length ); //0
// will return the SPAN (booo!)
alert( foo.querySelectorAll('body div span').length ); // 1
</script>
IE8 及以上浏览器都支持 querySelectorAll方法, 可是在元素上调用时,指定的选择器仍然在整个文档中进行匹配。 然后过滤出结果集,以便结果集只包括指定元素的后代元素, 也就是说你能够指定"body div span" 选择器字符串,字符串能够包括元素的祖先。而不不过 span.
// jQuery
$("#foo").find("> span"); // DOM document.getElementById("foo").querySelectorAll(">span") 不支持 >span 这样的css选择符
document.getElementById("foo").querySelectorAll(":root > span") //须要配合:root等于 div#foo, 而不是document element
错误的处理
var selector = "div:foo";
try {
document.querySelectorAll(selector);
} catch(e) {
alert(selector.slice(e.position)); // ":foo"
}
假设指定选择符有问题, querySelectorAll 会报错, 所以必须经过 try{}catch(e){} 处理
getAttribute
对于IE7 等老版的浏览器, 不能获得placeholder, 而attributes['placeholder'] 或者 getAttributeNode('placeholder').nodeValue 能够获得.
offsetLeft bug 问题
IE8 中offsetLeft 和 offsetTop 会包括父元素border的宽度, 而其他浏览器则没有。 并且在dojo的解决方式是减去父元素的border值,假设在定位元素中单多了一个div容器(border:0), 那么减去的是0, 而不是最外层容器的border 5px;
scrollLeft 问题
在使用scrollLeft 获取滚动栏的位置时,须要考虑 dir="rtl" 时,文档从右向左, 滚动栏向右移动时,IE返回正值(IE8及以上,是相对于浏览器右端的值,而IE7是相对于左端的值),而其他浏览器是负值。 在现实代码中不用考虑这样的情况,但在阿拉伯语的网页中,须要考虑
document.body
在dojo/_base/window.js 中有一个 body(document)方法,我们平时能够直接使用document.body来调用,可是在xhtml中,不能使用这样的方法,仅仅能使用document.getElementsByTagName('body')[0]
parentWindow 与 defaultView
parentWindow 是IE特有的属性, 通过document.parentWindow 或者 document.defaultView 获得文档所在的Window对像。
在dojo的dom-geometry的docScroll获取滚动栏位置(可能是窗体滚动栏,也可能是frame的滚动栏),所以须要依据传入的document来获得Window对像.
innerText 与 innerHTML
dojo-prop 中设置元素的文本时,会调用textContent, 而不会调用 innerText, 而是创建一个createTextNode('value'), 原因例如以下 http://msdn.microsoft.com/en-us/library/ms533899%28v=VS.85%29.aspx
1. innerText 仅仅在block element 中有效,假设你在<hr>元素上调用,会报错
2. 对于 html, table, tBody, tFoot, tHead, and tr, innerText & innerHTML 是仅仅读属性
还须要注意一个问题, 在清除元素的子节点时。一般会使用 removeChild() 方法, 可是removeChild在IE中会导致内存泄漏。 所以能够使用 innerHTML = "" ;
版权声明:本文博客原创文章,博客,未经同意,不得转载。
Javascript J更深层次的理解avascript 基础知识的更多相关文章
- javascript中关于日期和时间的基础知识
× 目录 [1]标准时间 [2]字符串 [3]闰年[4]月日[5]星期[6]时分秒 前面的话 在介绍Date对象之前,首先要先了解关于日期和时间的一些知识.比如,闰年.UTC等等.深入了解这些,有助于 ...
- javascript学习总结(一):基础知识。
1 数据类型a.数据类型共有7种,字符串(string).数字(number).布尔(boolean).数组(array).对象(object).Null.Undefined. 其中布尔(逻辑)类型只 ...
- JavaScript面试技巧(一):基础知识
1.变量类型和计算 变量类型:值类型.引用类型.typeof运算符. 变量计算:字符串拼接.==运算符.if语句.逻辑运算符 2.原型和原型链 构造函数 5个原型规则 3.作用域和闭包-执行上下文 4 ...
- Junit测试的理解------java基础知识
前言:不知道是最近懒了,还不不想认真写博客,其实写一个质量高的博客是需要时间的,没办法时间太紧了 package com.mon11.day13.linkedlist; import static o ...
- 【JavaScript你需要知道的基础知识~】
最近开始学习JavaScript,整理了一些相关的基础知识 JS注释方式:// 单行注释(Ctrl+/ )/* 段落注释(Ctrl+shift+/ )*/ [JavaScript基础]JavaScri ...
- [C# 基础知识梳理系列]专题六:泛型基础篇——为什么引入泛型
引言: 前面专题主要介绍了C#1中的2个核心特性——委托和事件,然而在C# 2.0中又引入一个很重要的特性,它就是泛型,大家在平常的操作中肯定会经常碰到并使用它,如果你对于它的一些相关特性还不是很了解 ...
- JavaScript基础知识从浅入深理解(一)
JavaScript的简介 javascript是一门动态弱类型的解释型编程语言,增强页面动态效果,实现页面与用户之间的实时动态的交互. javascript是由三部分组成:ECMAScript.DO ...
- 快速掌握JavaScript面试基础知识(二)
译者按: 总结了大量JavaScript基本知识点,很有用! 原文: The Definitive JavaScript Handbook for your next developer interv ...
- 自己理解的javascript 的对象和类理解
首先需要先理解类和对象的意义,我个人理解如下: 类:对象的抽象化: 对象:类的实体: javascript中没有class关键字和类的用法,只能用伪类来做类的,所以要用function来定义累的名字: ...
随机推荐
- Oracle Dataguard 介绍
Oracle DataGuard介绍 一. DataGuard的基本原理 当某次事务处理对生产数据库中的数据作出更改时,Oracle数据库将在一个联机重做日志文件里记录此次更改.在DataGuard中 ...
- [置顶] JUnit入门教程(二)
一:介绍 接着上次的课程,今天我们学习JUnit4的新特性 assertThat()方法,这种方式和其余的assert方法比起来,更加接进英语. 二:分析API API中的例子: 参数 T Actua ...
- Html5 Device API详解
三.四月曾学习过html5相关知识,并就html5 device api做过一次讲解 课程时长一个小时,预期达到level 200目标,即知道html5 device api是什么,且知道怎么实现 面 ...
- 自定义ComboBox,简简单单实现
private void Button_Click(object sender, RoutedEventArgs e) { Popup1.PlacementTarget = TesTextBox; P ...
- Android开发之文件下载,状态时显示下载进度,点击自动安装
在进行软件升级时,需要进行文件下载,在这里实现自定义的文件下载,并在状态栏显示下载进度,下载完成后,点击触发安装. 效果如图: 用于下载文件和显示现在进度的线程类如下: [java] view pl ...
- 【Cocos2d-x 粒子系统】火球用手指飞起来
程序: 创建球 sp1 = CCSprite::create("ball.png"); sp1->setPosition(ccp(10, visibleSize.height ...
- 浅谈新一代Android操作系统Android L
今天早一些的时候,Google公布了新一代Android操作系统Android L.让我很意外的是命名规则的变化,之前外界纷纷推測会叫Android5.0,同一时候会给一个甜品的名字命名.由于Andr ...
- android一些面试题目
1.ListView怎么提高滑动效率 2.说下你做过项目的包的构架,(联网,解析,activity,database) 重点 3.载入大量图片怎么做(包含小图和查看大图) 怎么降低一次跟server的 ...
- Swift语言教程中文文档
Swift语言教程中文文档 Swift语言教程(一)基础数据类型 Swift语言教程(二)基础数据类型 Swift语言教程(三)集合类型 Swift语言教程(四) 集合类型 Swift语言教程(五)控 ...
- Java引进和应用的包装类
Java介绍包装类: 于Java它设计主张的想法,也就是说,一切都是对象.但是,我们知道,,Java数据类型分为基本数据类型和引用数据类型,但基本的数据怎么能成对象?为了解决这个问题,对需要8一个类的 ...