澳门新浦京8455com(一)

澳门新浦京8455com 2

正如所显示的,没有什么阻止编码器将完全随机的对象传递给
addDictionaryIO()。只有

使用defer属性可以让脚本在文档完全呈现之后再执行。延迟脚本总是按照指定它们的顺序执行。
使用async属性可以表示当前脚本不必等待其他脚本,也不必阻塞文档呈现。不能保证异步脚本按照它们在页面中出现的顺序执行。

  • 方法一

高级PHPV5对象研究
本文介绍了PHPV5一些更高级的面向设计的特性。其中包括各种对象类型,它们允许将系统中的组件相互分离,创建可重用、可扩展、可伸缩的代码。
领会暗示
首先介绍一下对象类型和类型提示的优点。一个类定义一种类型。从该类实例化的任何对象属于该类定义的类型。所以,使用Car类创建Car对象。如果Car类继承Vehicle超类,则Car对象还将是一个Vehicle对象。这反映了我们在现实世界中分类事物的方法。但正如您将看到的,类型不仅仅是分类系统元素的有用方法。类型是面向对象编程的基础,因为类型是良好一致的行为的保证。许多设计技巧来自该保证。
“开始了解PHPV5中的对象”展示对象为您保证了接口。当系统传递Dictionary对象时,您可以确定它具有$translations数组和summarize()方法。相反,关联数组不提供相同级别的确定性。要利用类提供的清晰接口,需要知道您的对象实际上是Dictionary的一个实例,而不是某个imposter。可以用instanceof操作符来手动验证这一点,该操作符是PHPV5引入的介于对象实例和类名之间的一个便捷工具。
instanceofDictionary
如果给定对象是给定类的实例,则instanceof操作符解析为真。在调用方法中第一次遇到Dictionary对象时,可以在使用它之前检查它的类型。
if($eninstanceofDictionary){ print$en-summarize(); }
但是,如果使用PHPV5的话,可以将对象类型检查构建到类或方法声明中。
在“开始了解PHPV5中的对象”中,重点介绍两个类:Dictionary,它存储术语和翻译,DictionaryIO,它将Dictionary数据导出自文件系统。这些特性使得将Dictionary文件发送到第三方翻译器变得容易,第三方翻译器可以使用自己的软件来编辑数据。然后,您可以重新导入已处理的文件。清单1是Dictionary类的一个版本,它接受一个DictionaryIO对象,并将其存储以备将来使用。
清单1.接受DictionaryIO对象的Dictionary类的一个版本 classDictionary{
public$translations=array(); public$type=”En”; public$dictio;
functionaddDictionaryIO($dictio){ $this-dictio=$dictio; }
functionexport(){ if($this-dictio){ $this-dictio-export($this); } } }
classDictionaryIO{ functionexport($dict){
print”exportingdictionarydata”.”($dict-type)/n”; } }
$en=newDictionary(); $en-addDictionaryIO(newDictionaryIO());
$en-export(); //output: //dumpingdictionarydata(En)
DictionaryIO类具有单个方法export(),它接受一个Dictionary对象,并使用它来输出假消息。现在,Dictionary具有两个新方法:addDictionaryIO(),接受并存储DictionaryIO对象;export(),使用已提供的对象导出Dictionary数据――或者是在完全实现的版本中。
您可能会疑惑为什么Dictionary对象不仅实例化自己的DictionaryIO对象,或者甚至在内部处理导入导出操作,而根本不求助于第二个对象。一个原因是您可能希望一个DictionaryIO对象使用多个Dictionary对象,或者希望存储该对象的单独引用。另一个原因是通过将DictionaryIO对象传递给Dictionary,可以利用类切换或多态性。换句话说,可以将DictionaryIO子类的实例传递给Dictionary,并更改运行时保存和检索数据的方法。
图1显示了Dictionary和DictionaryIO类及其使用关系。

for-in语句

var iframe = document.createElement('iframe');    document.body.appendChild(iframe);    xArray = window.frames[window.frames.length-1].Array;       var arr = new xArray("1","2","3","4","5");   alert(arr instanceof Array); // falsealert(Array.isArray(arr));//true

ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值。基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象。
引用类型的值是保存在内存中的对象。与其他语言不同,JavaScript不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。为此,引用类型的值是按引用访问的。

           Javascript设计模式与开发实践

var num1 = 5;
var num2 = num1;
var arr=[1,2,3,4];alert(Object.prototype.toString.call(arr)); //"[object Array]"

JavaScript的这三个组成部分,在当前五个主要浏览器(IE、Firefox、Chrome、Safari和Opera)中都得到了不同程度的支持。其中,所有浏览器对ECMAScript第3版的支持大体上都还不错,而对ECMAScript5的支持程度越来越高,但对DOM的支持则彼此相差比较多。对已经正式纳入HTML5标准的BOM来说,尽管各浏览器都实现了某些众所周知的共同特性,但其他特性还是会因浏览器而异。

由于每个iframe都有一套自己的执行环境,跨frame实例化的对象彼此是不共享原型链的,因此导致上述检测代码失效!为了解决这个问题,
ECMAScript 5 新增了 Array.isArray()
方法。这个方法的目的是最终确定某个值到底是不是数组,而不管它是在哪个全局执行环境中创建的。我们仍以上面的例子说明

文档模式

队列方法
结合使用shift()和push()方法,可以像使用队列一样使用数组:

2.instanceof 操作符

使用for-in循环来显示了BOM中window对象的所有属性。每次执行循环时,都会将window对象中存在的一个属性名赋值给变量propName。
ECMAScript对象的属性没有顺序。因此,通过for-in循环输出的属性名的顺序是不可预测的。具体来讲,如果属性都会被返回一次,但返回的先后次序可能会因浏览器而异。
但是,如果表示要迭代的对象的变量值为null或undefined,for-in语句会抛出错误。ECMAScript5更正了这一行为;对这种情况不在抛出错误,而只是不执行循环体。为了保证最大限度的兼容性,建议在使用for-in循环之前,先检测确认该对象的值不是null或undefined。

function isArray(object) {       return object!= null && typeof object == "object" && 'splice' in object && 'join' in object;       }  var liar = { splice: 1, join: 2 };   alert(isArray(liar));//true,成功骗过了检测方法

var Type={};for (var i = 0,type;type=['String','Array','Number'][i++];){       Type['is'+type]=function (obj) {         return Object.prototype.toString.call(obj)=='[object '+type+']';        }    }console.log(Type.isArray([]));//输出falseconsole.log(Type.hasOwnProperty("isArray"));//输出:trueconsole.log(type);//undefined
var colors = ["red", "green", "blue"];
alert(colors.join(",")); //red,green,blue
alert(colors.join("||")); //red||green||blue

Object.prototpye.toString() 本身也可能会被修改。这里讨论的技巧假设
Object.prototpye.toString() 是未被修改过的原生版本。

检测数组
自从ECMAScript3做出规定以后,就出现了确定某个对象是不是数组的经典问题。对于一个网页或者一个全局作用域而言,使用instanceof操作符就能得到满意的结果:

 
     obj instanceof
Array这个方法在前面已经介绍过了,也是不完美的。

JavaScript实现

       
判断其是否具有“数组性质”,如slice()方法。但是存在自己给该变量定义slice方法的情况,故有时会失效

虽然在检测基本数据类型时typeof是非常得力的助手,但在检测引用类型的值时,这个操作符的用处不大。通常,我们并不是想知道某个值是对象,而是想知道它是什么类型的对象。为此,ECMAScript提供了instanceof操作符:
如果变量是给定引用类型(根据它的原型链来识别)的实例,那么instanceof操作符就会返回true:

     
使用上文所述新方法Array.isArray(),但是支持 Array.isArray() 方法的浏览器有 IE9+、
Firefox 4+、 Safari 5+、 Opera 10.5+和
Chrome。对于版本比较旧的浏览器此方法不被支持。

很多开发人员错误地认为:在局部作用域中修改的对象会在全局作用域中反应出来,就说明参数是按引用传递的。为了证明对象是按值传递的,我们再看一看下面这个经过修改的例子:

function Animal() {}function Bird() {}Bird.prototype = new Animal();Bird.prototype.fly = function () {//do some thingalert('I can fly!');}var pigeon = new Bird();alert(pigeon instanceof Bird); //true 毫无疑问alert(pigeon instanceof Animal); //true 由于原型链的关系alert(pigeon instanceof Object); //true 

IE7及更早版本对JavaScript的实现中存在一个偏差,其unshift()方法总是返回undefined而不是数组的新长度。IE8在非兼容模式下会返回正确的长度值。

 以上那些方法看上去无懈可击,但是终究会有些问题,接下来介绍的方法可以说是无懈可击了。

在HTML中使用JavaScript

function getType(obj) {return (obj === null) ? "null" : typeof (obj);} 

使用typeof操作符检测函数时,该操作符会返回“function”。在Safari5及之前版本和Chrome7及之前版本中使用typeof检测正则表达式时,由于规范的原因,这个操作符也返回“function”。ECMA-262规定任何在内部实现[[Call]]方法的对象都应该在应用typeof操作符时返回“function”。由于上述浏览器中的正则表达式也实现了这个方法,因此对正则表达式应用typeof会返回“function”。在IE和Firefox中,对正则表达式应用typeof会返回“object”。

 根据规定,所有引用类型的值都是
Object
的实例。因此,在检测一个引用类型值和
Object
构造函数时,
instanceof
操作符始终会返回 true。当然,如果使用 instanceof 操作符检测基本类型的值,则该操作符始终会返回 false,因为基本类型不是对象。看似instanceof
操作符能完全解决检测对象类型的问题,实际应用中也确实够用的。但是instanceof仍然存在一个问题**,它假定只有一个全局执行环境。以检测对象是否为数组类型为例, **如果网页中包含多个框架,那实际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的
Array 构造函数。如果你从一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具有各自不同的构造函数。

var colors = new Array(); 
var count = colors.unshift("red", "green"); 
alert(count); //2
count = colors.unshift("black");
alert(count); //3
var item = colors.pop();
alert(item); //"green"
alert(colors.length); //2

我们发现,这些函数的大部分实现都是相同的,不同的只是Object.prototype.toString.call(value)返回的字符串。为了避免多余的代码,可以尝试把这些字符串作为参数提前植入isType函数,代码如下:

数组继承的toLocaleString()、toString()和valueOf()方法,在默认情况下都会以逗号分隔的字符串的形式返回数组项。而如果使用join()方法,则可以使用不同的分隔符来构建这个字符串。join()方法只接收一个参数,即用作分隔符的字符串,然后返回包含所有数组项的字符串:

参考:Javascript高级程序设计(第3版)

复制变量值

注意上述代码使用闭包封闭了变量type;这样当函数检测函数调用时从内到外查找变量type,会先找到封闭在闭包环境的type.试想一下不使用闭包来完成上述批量注册函数:

var s = "Nicholas";
var b = true;
var i = 22;
var u;
var n = null;
var o = new Object();
alert(typeof s); //string
alert(typeof i); //number
alert(typeof b); //boolean
alert(typeof u); //undefined
alert(typeof n); //object
alert(typeof o); //object

说到数组类型,下面总结一下如何判断变量是否为数组类型?

alert(person instanceof Object); // 变量person是Object吗?
alert(colors instanceof Array); // 变量colors 是Array吗?
alert(pattern instanceof RegExp); // 变量pattern 是RegExp吗?
var iframe = document.createElement('iframe');    document.body.appendChild(iframe);    xArray = window.frames[window.frames.length-1].Array;       var arr = new Array("1","2","3","4","5");   alert(arr instanceof Array); // false
var colors = new Array(); 
var count = colors.push("red", "green"); 
alert(count); //2
count = colors.push("black"); 
alert(count); //3
var item = colors.shift();
alert(item); //"red"
alert(colors.length); //2

如果变量是给定引用类型(根据它的原型链来识别)的实例,那么instanceof 操作符就会返回 true。请看下面的例子:

function setName(obj) {
  obj.name = "Nicholas";
  obj = new Object();
  obj.name = "Greg";
}
var person = new Object();
setName(person);
alert(person.name); //"Nicholas"

大家知道,在任何值上调用 Object 原生的 toString()
方法,都会返回一个[object NativeConstructorName]
格式的字符串。每个类在内部都有一个[[Class]]
属性,这个属性中就指定了上述字符串中的构造函数名。举个例子吧。

instanceof操作符的问题在于,它假定只有一个全局执行环境。如果网页中包含多个框架,那实际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的Array构造函数。如果你从一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具有各自不同的构造函数。
为了解决这个问题,ECMAScript5新增了Array.isArray()方法。这个方法的目的是最终确定某个值到底是不是数组,而不管它是在哪个全局执行环境中创建的:

不仅如此,对于自定义的对象,此方法仍然有效,请看下面的例子。

num1中保存的值是5,。当使用num1的值来初始化num2时,num2中也保存了值5。但num2中的5与num1中的5是完全独立的,该值只是num1中5的一个副本。此后,这两个变量可以参与任何操作而不会相互影响。

var s = "Nicholas";var b = true;var i = 22;var u;var n = null;var o = new Object();alert(typeof s); //stringalert(typeof i); //numberalert(typeof b); //booleanalert(typeof u); //undefinedalert(typeof n); //objectalert(typeof o); //object

澳门新浦京8455com 1

1.typeof操作符

检测类型
typeof操作符是确定一个变量是字符串、数值、布尔值,还是undefined的最佳工具。如果变量的值是一个对象或null,则typeof操作符会像下面例子中所示的那样返回“object”:

我们会发现类型检测函数失效了,数组类型检测函数并不能检测数组了,产生这种情况的原因是当isArray函数执行时,for循环已经执行结束了,此时type=[‘String’,’Array’,’Number’][3]=undefined,检测函数中的语句
Object.prototype.toString.call(obj)=='[object
‘+type+’]’;
表达式右侧的值永远是'[object
undefined]’,因此传入任何类型,此表达式都不成立,从而返回false.

同时使用unshift()和pop()方法,可以从相反的方向来模拟队列,即在数组的前端添加项,从数组末端移除项:

来自为知笔记(Wiz)

label语句
使用label语句可以在代码中添加标签,以便将来使用。

但是从上面的执行结果可以看到,如果变量的值是一个对象或 null,则 typeof
操作符会像例子中所示的那样返回”object”
那么问题来了,如何检测Null呢?
如果想将null和对象区分开,则必须进行显示检查

栈方法
push()方法可以接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度。而pop()方法则从数组末尾移除最后一项,减少数组的length值,然后返回移除的项:

同样,也可以基于这一思路来测试某个值是不是原生函数或正则表达式

传递参数
在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量(即命名参数,或者用ECMAScript的概念来说,就是arguments对象中的一个元素)。在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反应在函数的外部:

  • 方法四
var colors = new Array(); 
var count = colors.push("red", "green");
alert(count); //2
count = colors.push("black"); 
alert(count); //3
var item = colors.pop(); 
alert(item); //"black"
alert(colors.length); //2
result = variable instanceof constructor
if (Array.isArray(value)){
}
function isArray(value){return Object.prototype.toString.call(value) == "[object Array]";}
if (value instanceof Array){
}

要检测一个变量是不是基本数据类型, typeof 操作符是最佳的工具。

start: for (var i=0; i < count; i++) {
    alert(i);
}

           Javascript权威指南(第六版)


var Type={};for (var i = 0,type;type=['String','Array','Number'][i++];){    (function (type) {        Type['is'+type]=function (obj) {         return Object.prototype.toString.call(obj)=='[object '+type+']';        }    })(type)}//调用检测函数Type.isArray([]);//输出:trueType.isString("str");//输出:true
var person1 = {
  toLocaleString : function () {
    return "Nikolaos";
  },
  toString : function() {
    return "Nicholas";
  }
};
var person2 = {
  toLocaleString : function () {
    return "Grigorios";
  },
  toString : function() {
    return "Greg";
  }
};
var people = [person1, person2];
alert(people); //Nicholas,Greg
alert(people.toString()); //Nicholas,Greg
alert(people.toLocaleString()); //Nikolaos,Grigorios

虽然在检测基本数据类型时 typeof
是非常得力的助手,但在检测引用类型的值时,这个操作符的用处不大。 通常,
我们并不是想知道某个值是对象,而是想知道它是什么类型的对象。为此,
ECMAScript提供了 instanceof 操作符,其语法如下所示:

for (var propName in window) {
    document.write(propName);
}

由于原生数组的构造函数名与全局作用域无关,因此使用 toString()
就能保证返回一致的值。利用这一点,可以创建如下函数用来检测变量是否是数组类型:

根据规定,所有引用类型的值都是Object的实例。因此,在检测一个引用类型值和Object构造函数时,instanceof操作符始终会返回true。当然,如果使用instanceof操作符检测基本类型的值,则该操作符始终会返回false,因为基本类型不是对象。

  • 方法三

这个例子中定义的start标签可以在将来由break或continue语句引用。加标签的语句一般都要与for语句等循环语句配合使用。

我们还可以用循环语句,来批量注册这些isType函数


function addTen(num) {
    num += 10;
    return num;
}
var count = 20;
var result = addTen(count);
alert(count); //20􀇈没有􀕎􀣅
alert(result); //30

function setName(obj) {
    obj.name = "Nicholas";
}
var person = new Object();
setName(person);
alert(person.name); //"Nicholas"
  • 基本数据类型:String,Boolean,Number,Undefined, Null
  • 引用数据类型:Object(Array,Date,RegExp,Function)
  • 核心(ECMAScript):提供核心语言功能。
  • 文档对象模型(DOM):提供访问和操作网页内容的方法和接口。
  • 浏览器对象模型(BOM):提供与浏览器交互的方法和接口。
  • 方法二

当从一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到新变量分配的空间中。不同的而是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象。复制操作结束后,两个变量实际上将引用同一个对象。因此,改变其中一个变量,就会影响另一个变量。

var isType=function(type) {    return function (obj) {      return Object.prototype.toString.call(obj)=='[object '+type+']';    }};var isString=isType('String');var isArray=isType('Array');var isNumber=isType('Number');var isRegExp=isType('RegExp');console.log(isNumber(2));

转换方法
所有对象都具有toLocaleString()、toString()和valueOf()方法。toLocaleString()方法经常也会返回与toString()和valueOf()方法相同的值,但也不总是如此。当调用数组的toLocaleString()方法时,它也会创建一个数组值的以逗号分隔的字符串。而与前两个方法唯一的不同之处在于,这一次为了取得每一项的值,调用的是每一项的toLocaleString()方法,而不是toString()方法:

function isFunction(value){return Object.prototype.toString.call(value) == "[object Function]";}function isRegExp(value){return Object.prototype.toString.call(value) == "[object RegExp]";}

如果数组中的某一项的值是null或者undefined,那么该值在join()、toLocaleString()、toString()和valueOf()方法返回的结果中以空字符串表示。

alert(person instanceof Object); // 变量 person 是 Object 吗?alert(colors instanceof Array); // 变量 colors 是 Array 吗?alert(pattern instanceof RegExp); // 变量 pattern 是 RegExp 吗?

IE5.5引入了文档模式的概念,而这个概念是通过使用文档类型(doctype)切换实现的。最初的两种文档模式是:混杂模式和标准模式。
对于标准模式,可以使用下面任何一种文档类型来开启:

基本类型和引用类型的值

Javascript有5种简单数据类型和一种复杂数据类型

一个完整的JavaScript实现应该由下列三个不同的部分组成:

(2016-4-26续)


澳门新浦京8455com 2

按照惯例,外部JavaScript文件带有.js扩展名。但这个扩展名不是必须的,因为浏览器不会检查包含JavaScript的文件的扩展名。这样一来,使用JSP、PHP或其他服务器端语言动态生成JavaScript代码也就成为了可能。但是,服务器通常还是需要看扩展名决定为响应应用哪种MIME类型。如果不使用.js扩展名,请确保服务器能返回正确的MIME类型。
通过<script>元素的src属性还可以包含来自外部域的JavaScript文件。这一点既让<script>元素倍显强大,又让它备受争议。在这一点上,<script>与<img>元素非常相似,即它的src属性可以是指向当前HTML页面所在域之前的某个域中的完整URL。
无论如何包含代码,只要不存在defer和async属性,浏览器都会按照<script>元素在页面中出现的先后顺序对它们依次进行解析。

var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Nicholas";
alert(obj2.name); //"Nicholas"

而对于准标准模式,则可以通过使用过渡性(transitional)或框架集型(frameset)文档类型来触发:

支持Array.isArray()方法的浏览器有IE9+、Firefox4+、Safari5+、OPera10.5+和Chrome。

语句


You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图