Javascript > 菜鸟新人的一点小整理&积累

Web Workers

Web Workers是 HTML5 提供的一个javascript多线程解决方案,我们可以将一些大计算量的代码交由Web Worker运行而不冻结用户界面。Web Worker的基本原理就是在当前javascript的主线程中,使用Worker类加载一个javascript文件来开辟一个新的线程,起到互不阻塞执行的效果,并且提供主线程和新线程之间数据交换的接口:postMessage,onmessage。示例如下:

在 Web Workers 中使用 postMessage 和 onmessage

首先,需要在客户端页面的 JavaScript 代码中 new 一个 Worker 实例出来,参数是需要在另一个线程中运行的 JavaScript 文件名称。然后在这个实例上监听 onmessage 事件。最后另一个线程中的 JavaScript 就可以通过调用 postMessage 方法在这两个线程间传递数据了。

清单1. 主线程中创建 Worker 实例,并监听 onmessage 事件

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
<title>Test Web worker</title> 
<script type="text/JavaScript"> 
    function init(){ 
        var worker = new Worker('compute.js'); 
        //event 参数中有 data 属性,就是子线程中返回的结果数据
        worker.onmessage= function (event) { 
            // 把子线程返回的结果添加到 div 上
            document.getElementById("result").innerHTML += event.data+"<br/>"; 
        }; 
    } 
</script> 
</head> 
<body onload="init()"> 
<div id="result"></div> 
</body> 
</html>

在客户端的 compute.js 中,只是简单的重复多次加和操作,最后通过 postMessage 方法把结果返回给主线程,目的就是等待一段时间。而在这段时间内,主线程不应该被阻塞,用户可以通过拖拽浏览器,变大缩小浏览器窗口等操作测试这一现象。这个非阻塞主线程的结果就是 Web Workers 想达到的目的。

清单2. compute.js 中调用 postMessage 方法返回计算结果

var i=0; 
function timedCount(){ 
    for(var j=0,sum=0;j<100;j++){ 
        for(var i=0;i<100000000;i++){ 
            sum+=i; 
        } 
    } 
    // 调用 postMessage 向主线程发送消息
    postMessage(sum); 
} 

postMessage("Before computing,"+new Date()); 
timedCount(); 
postMessage("After computing,"+new Date());

Javascript Array 对象的常见属性及方法

属性
constructor

对象的 constructor 属性用于返回创建该对象的函数,也就是我们常说的构造函数。因此该属性并不是只有Array对象才有。

在JavaScript中,每个具有原型的对象都会自动获得constructor属性。除了arguments、Enumerator、Error、Global、Math、RegExp、Regular Expression等一些特殊对象之外,其他所有的JavaScript内置对象都具备constructor属性。例如:Array、Boolean、Date、Function、Number、Object、String等。所有主流浏览器均支持该属性。

语法:object.constructor

示例如下:

<html>
<body>
<script type="text/javascript">
    function employee(name,job,born){
        this.name=name;//哈哈哈
        this.job=job;
        this.born=born;
    }
    var bill=new employee("Bill Gates","Engineer",1985);

    document.write(bill.constructor);   //打印bill的构造函数,结果如下:

    //function employee(name,job,born) { this.name=name;//哈哈哈 this.job=job; this.born=born; }

    document.write((bill.constructor === employee) + "<br/>");  //true
    document.write(("str".constructor === String) + "<br/>");   //true

</script>
</body>
</html>

可以看出它会将自己定义的构造函数的全部代码(甚至包括注释)返回回来。不过如果直接用“==”与函数名做判断,也会得到 true,同样适用于Array、String、Number等基本数据类型对应的构造函数。

下面一些具体的代码供学习(转自网络):

// 字符串:String()
var str = "张三";
document.writeln(str.constructor); // function String() { [native code] }
document.writeln(str.constructor === String); // true

// 数组:Array()
var arr = [1, 2, 3];
document.writeln(arr.constructor); // function Array() { [native code] }
document.writeln(arr.constructor === Array); // true

// 数字:Number()
var num = 5;
document.writeln(num.constructor); // function Number() { [native code] }
document.writeln(num.constructor === Number); // true

// 自定义对象:Person()
function Person(){
    this.name = "CodePlayer";
}
var p = new Person();
document.writeln(p.constructor); // function Person(){ this.name = "CodePlayer"; }
document.writeln(p.constructor === Person); // true

// JSON对象:Object()
var o = { "name" : "张三"};
document.writeln(o.constructor); // function Object() { [native code] }
document.writeln(o.constructor === Object); // true

// 自定义函数:Function()
function foo(){
    alert("CodePlayer");
}
document.writeln(foo.constructor); // function Function() { [native code] }
document.writeln(foo.constructor === Function); // true

// 函数的原型:bar()
function bar(){
    alert("CodePlayer");
}
document.writeln(bar.prototype.constructor); // function bar(){ alert("CodePlayer"); }
document.writeln(bar.prototype.constructor === bar); // true

笔试时一些已经忘记的知识回顾

  1. 二叉树的前序中序后序遍历说的都是根节点的顺序,如前序遍历的顺序为“根节点→左叶子结点→右叶子节点”,中序遍历的顺序为“左叶子结点→根叶子节点→右叶子节点”,后序遍历的顺序为“左叶子结点→右叶子节点→根叶子节点”。因此可以从前序遍历或者后序遍历轻易得到根节点。

  2. 未指定返回值的函数返回的是一个特殊的undefined。typeof为Undefined。

  3. 对基本数据类型添加属性,属性最终会返回undefined。(即使执行了添加属性的操作,属性也不会存在)

  4. 对于储存在栈中还是堆中,可以这样理解:根据程序逻辑明确需要申请的内存,即在解析代码时知道这块内存必须申请,比如一个基本数据类型的声明和赋值:var str = “hahaha”,(即使是只声明不赋值,也应该会分配内存,因此此时应该为undefined值,如 var a;)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值