在创建具有多个参数的JavaScript函数时,我总是面临这样的选择:传递参数列表与传递选项对象.
例如,我正在编写一个函数来将nodeList映射到数组:
function map(nodeList, callback, thisObject, fromIndex, toIndex){
...
}
Run Code Online (Sandbox Code Playgroud)
我可以改用它:
function map(options){
...
}
Run Code Online (Sandbox Code Playgroud)
options是一个对象:
options={
nodeList:...,
callback:...,
thisObject:...,
fromIndex:...,
toIndex:...
}
Run Code Online (Sandbox Code Playgroud)
推荐哪种方式?是否有何时使用其中一种?
[更新]似乎有一个共识支持选项对象,所以我想添加一个注释:在我的案例中我试图使用参数列表的一个原因是有一个与JavaScript一致的行为内置于array.map方法.
对于JavaScript对象或JSON字符串,键名中是否有任何禁用字符?还是需要转义的字符?
更具体地说,我想在键名中使用"$"," - "和空格.
我正在使用jQuery,并想知道我是否应该使用val()或text()(或其他方法)来读取和更新textarea的内容.
我已经尝试了两种方法,但我遇到了两个问题.当我使用text()更新textarea时,换行符(\n)不起作用.当我使用val()来检索textarea内容时,如果文本太长,则文本会被截断.
我阅读了有关sessionStorage和localStorage的一些文档,但我不明白范围是什么:域,特定页面?
例如,如果我有以下页面:
http://example.com/products.aspx?productID=1
http://example.com/products.aspx?productID=2
http://example.com/services.aspx?serviceID=3
如果我在上面的每个页面上运行(idvalue是查询字符串中的值):
localStorage.setItem('ID',idvalue);
Run Code Online (Sandbox Code Playgroud)
我最终会存储3个不同的值,或者值是否会相互覆盖?
如何在gzip压缩之后估算我的JavaScript文件的大小?有在线工具吗?或者它与使用winzip类似?
在ES6中过滤或映射节点列表的最有效方法是什么?
根据我的读数,我会使用以下选项之一:
[...nodelist].filter
Run Code Online (Sandbox Code Playgroud)
要么
Array.from(nodelist).filter
Run Code Online (Sandbox Code Playgroud)
你会推荐哪一个?有没有更好的方法,例如没有涉及数组?
我的目标是观察输入值并在其值以编程方式更改时触发处理程序.我只需要它用于现代浏览器.
我尝试了很多组合使用defineProperty
,这是我最新的迭代:
var myInput=document.getElementById("myInput");
Object.defineProperty(myInput,"value",{
get:function(){
return this.getAttribute("value");
},
set:function(val){
console.log("set");
// handle value change here
this.setAttribute("value",val);
}
});
myInput.value="new value"; // should trigger console.log and handler
Run Code Online (Sandbox Code Playgroud)
这似乎做了我的预期,但感觉就像一个黑客,因为我重写现有的价值属性和玩value
(属性和属性)的双重身份.它还打破了change
似乎不喜欢修改属性的事件.
我的其他尝试:
watch
和observe
polyfill,但它们打破输入值属性什么是获得相同结果的正确方法?
现场演示:http://jsfiddle.net/L7Emx/4/
[编辑]澄清一下:我的代码正在观看一个输入元素,其他应用程序可以推送更新(例如,由于ajax调用,或者由于其他字段的更改).我无法控制其他应用程序如何推送更新,我只是一个观察者.
[编辑2]为了澄清"现代浏览器"的含义,我对能够在IE 11和Chrome 30上运行的解决方案感到非常满意.
[更新]根据接受的答案更新了演示:http://jsfiddle.net/L7Emx/10/
@ mohit-jain建议的技巧是为用户交互添加第二个输入.
我的网页使用iframe来收集其他网页的内容.所有页面都在同一个域中.
从主页面,有没有办法确认所有iframe已加载,并且没有404错误?
我需要一个JSON polyfill来支持IE 7和一些IE 8和IE 9模式.我应该选择JSON 2还是JSON 3?显然JSON 3是一个更现代的实现,但是例如像html5please这样的网站甚至没有提及它并推荐JSON 2.
在我的JavaScript应用程序中,我仅将几个对象用于内部目的(用户不需要访问它们).例如:
var images={
blank:"blank.gif",
plus:"plus.gif",
minus:"minus.gif"
}
Run Code Online (Sandbox Code Playgroud)
当我使用像Uglify.js这样的缩小器时,属性名称(空白,加号,减号)保持不变.有没有办法缩小它们?
到目前为止我所考虑的事情:
有没有更好的办法?