Junhc

岂止于博客

JavaScript

目录

1. caller

属性:caller
说明:func.caller 返回一个调用方函数的引用

function func(){
  if(func.caller){
     console.log(func.caller.arguments);
  }else{
     console.log("没有函数调用我!");
  }
}

function handle(){
  func();
}

func();
handle("K.K");
//没有函数调用我!
//["K.K"]
2. callee

属性:callee
说明:arguments.callee 返回正被执行的函数对象,callee是arguments的一个属性成员,
它表示对函数对象本身的引用

function func(arg0,arg1){
  console.log(arguments.callee.toString());
  console.log("实参长度:"+arguments.length);
  console.log("形参长度:"+arguments.callee.length);
}

func();
//function func(arg0,arg1){
//  console.log(arguments.callee.toString());
//  console.log("实参长度:"+arguments.length);
//  console.log("形参长度:"+arguments.callee.length);
//}
//实参长度:0
//形参长度:2
3. apply&call

函数:applycall
说明:使用apply(this,arguments)call(this,arg0,arg1,...)在Sub函数的作用域中调用Super函数,因此调用后Sub函数就拥有了Super函数的所有属性和方法。

function Super(){
  console.log("执行Super");
  console.log(arguments);
  this.name="我是Super";
  this.message=function(content){
    console.log(content);
  };
}

function Sub(){
  console.log("执行Sub");
  //调用Super,Super构造函数中的this会指向Sub
  Super.apply(this,arguments);
  console.log(this.name);
}

Sub("K.K");
//执行Sub
//执行Super
//["K.K"]
//我是Super

var value="global 变量";

function local(){
   this.value="local 变量";
}

function func(){
   console.log(this.value);
}

func();
func.apply(window);
func.apply(new local());
//global 变量
//global 变量
//local 变量
4. prototype

说明:每个函数都有一个prototype属性,这个属性是一个对象,它的用途是包含可以由特定类型的所有实例共享的属性和方法。

5. 终极弹窗解决方案
// 跳转
function redirect(url) {
	var form = $("<form method='get' target='_blank' style='display:none;'></form>");
	form.attr({
		"action": url
	});

	if (url.indexOf("?") > -1) {
		var queryString = {};
		url.replace(/(\w+)=(\w+)/ig, function($0, $1, $2) {
			queryString[$1] = $2;
		});
		for (name in queryString) {
			var input = $("<input type='hidden'>");
			input.attr({
				"name": name
			});
			input.val(queryString[name]);
			form.append(input);
		};
	}

	form.append($("<input type='submit'/>"));
	$("body").append(form);
	form.submit();
}

// 下载
function download() {
	var iframe = document.getElementById('iframe_download_file');
	if (!iframe) {
		iframe = document.createElement("iframe");
		iframe.id = 'iframe_download_file';
		iframe.style.display = "none";
		document.body.appendChild(iframe);
	}
	iframe.src = url;
}
6. boolean

说明:如果逻辑对象无初始值或者其值为 0、-0、null、”“、false、undefined 或者 NaN,那么对象的值为 false。否则,其值为 true(即使当自变量为字符串 “false” 时)

//返回false
var isFalse = new Boolean();
var isFalse = new Boolean(0);
var isFalse = new Boolean(false);
var isFalse = new Boolean(null);
var isFalse = new Boolean("");
var isFalse = new Boolean(NaN);
//返回true
var isTrue = new Boolean(1);
var isTrue = new Boolean(true);
var isTrue = new Boolean("true");
var isTrue = new Boolean("false");
var isTrue = new Boolean("K.K");
7. 封装请求参数
;
(function($) {
    $.extend({
        queryString: function(name) {
            function toMap() {
                var p = {},
                    e,
                    a = /\+/g, // Regex for replacing addition symbol with a space
                    r = /([^&=]+)=?([^&]*)/g,
                    d = function(s) {
                        return decodeURIComponent(s.replace(a, " "));
                    },
                    q = window.location.search.substring(1);
                // exec() 方法的功能非常强大
                while ((e = r.exec(q))!=null) {
                    p[d(e[1])] = d(e[2]);
                }
                return p;
            }
            if (!this._queryString) {
                this._queryString = toMap();
            }
            return this._queryString[name];
        }
    });
})(jQuery);
8. 一道ECMAScript6有趣的面试题
const x = ?;
if (('a' in x) && !('a' in x)) {
	console.log('WIN');
}
// 输出WIN
// 使用ES6代理对象..重写has方法..
const x = new Proxy({
   'a': false
}, {
   has(target) {
      return target.a = !target.a;
   }
});

// 另辟蹊径, 两个a的语义不一样..半角英文a和全角英文a..咳咳, 只谈思路的话, 很有想法..