精通javascript(看书笔记)

变量的类型检查

        //检测类型
        var str = "Hello World";
        if (typeof str=="string") {//使用typeof来判断对象类型的一个例子
            
        }
        if (str.constructor==String) {//使用构造函数属性来判断对象的类型
            //constructor 属性在每个对象中都存在,并一直指向创建它的函数
        }

使用constructor的另外一个例子

        function User() {
        }
        var me = new User();
        alert(me.constructor == User);//true
        var you = new me.constructor();
        alert(me.constructor == you.constructor);//true

复制代码
        //用一个变量类型列表严格检查一个参数列表
        function strict(types,args) {
            if (types.length != args.length) {
                throw "Invalid number of arguments. Expected " + types.length + " ,received " + args.length + "  instead.";
            }
            for (var i = 0; i < args.length; i++) {
                if (args[i].constructor!=types[i]) {
                    throw "Invalid argument type. Expected " + types[i].name + " ,received " + args[i].constructor.name + " instead.";
                }
            }
        }
        strict([String, Number, Array], ["mytest", 12, [11, 22, 33]]);
复制代码

 

函数curry化

Curry化是一种通过把多个函数填充到函数体中,实现将函数转换为一个新的经过简化的(使之接受的参数更少)函数的技术

        function addGenerator(num) {
            return function (toAdd) {
                return num + toAdd;
            };
        }
        var addFive = addGenerator(5);
        alert(addFive(4) == 9);

使用特权方法的例子

        function User(name,age) {
            var year = (new Date()).getFullYear() - age;
            this.getYearBorn = function () {//创建一个特权方法,能够访问到year变量,同时自身属于公共可访问的
                return year;
            }
        }
        var user = new User('angela', 1989);
        alert(user.getYearBorn() == 26);

动态生成方法的例子

复制代码
        function User(properties) {
            for (var i in properties) {
                (function (which) {
                    var p = i;
                    which["get" + p] = function () {
                        return properties[p];
                    }
                    which["set" + p] = function (val) {
                        properties[p] = val;
                    }
                })(this);
            }
        }
        var user = new User({
            name: "angela",
            age: 26
        });
        alert(user.name == null);//true   //name属性并不存在  因为它是属性对象的私有变量
        alert(user.getname() == "angela");//true  //使用新的getname方法来获得这个值  这个函数是动态生成的
        user.setage(22);
        alert(user.getage() == 22);//true
复制代码

静态方法的例子

复制代码
        function User(name, age) {
            this.name = name;
            this.age = age;
        }
        var user = new User('angela',26);

        User.cloneUser = function (user) {//静态方法
            return new User(user.name, user.age);//创建并返回一个新的用户
        }
       
        var cloneUser = User.cloneUser(user);
        alert(cloneUser.name);//angela
复制代码

 

浏览器的渲染和操作顺序

检测DOM是否可用

复制代码
        function domReady(f) {
            if (domReady.done) {//如果已经加载完成 马上执行函数
                return f();
            }
            if (domReady.timer) {//如果我们已经增加了一个函数
                domReady.ready.push(f);//把它加入待执行函数清单中
            } else {
                addEvent(window, 'load', isDOMReady);//添加事件监听
            }

            domReady.ready = [f];//初始化待执行函数的数组
            domReady.timer = setInterval(isDOMReady, 13);//尽可能快地检查DOM是否可用
        }
        function isDOMReady() {//检查DOM是否已可操作
            if (domReady.done) {//如果我们能判断出DOM已可用,忽略
                return false;
            }
            //检查若干函数和元素是否可用
            if (document&&document.getElementsByTagName&&document.getElementById&&document.body) {
                clearInterval(domReady.timer);//如果可用则停止检查
                domReady.timer = null;
                //执行正在等待的函数
                for (var i = 0; i < domReady.ready.length; i++) {
                    domReady.ready[i]();
                }
                //记录我们在此已经完成
                domReady.ready = null;
                domReady.done = true;
            }
        }
复制代码

 

XPath

Curry化是一种通过把多个函数填充到函数体中,实现将函数转换为一个新的经过简化的(使之接受的参数更少)函数的技术

posted @   静逸  阅读(1518)  评论(1编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示