最近,我通过Crockford的JSLint运行了一些我的JavaScript代码,它给出了以下错误:
第1行问题1:缺少"使用严格"声明.
做一些搜索,我意识到有些人会加入"use strict";他们的JavaScript代码.一旦我添加了语句,错误就会停止显示.不幸的是,谷歌没有透露这个字符串声明背后的历史.当然它必须与浏览器如何解释JavaScript有关,但我不知道效果会是什么.
那么它是"use strict";什么,它意味着什么,它是否仍然相关?
当前的任何浏览器都会响应"use strict";字符串还是将来使用?
newJavaScript中的关键字在第一次遇到时会非常混乱,因为人们倾向于认为JavaScript不是面向对象的编程语言.
我正在编写一些JavaScript代码来解析用户输入的函数(用于类似电子表格的功能).解析了公式后,我可以将其转换为JavaScript并eval()在其上运行以产生结果.
但是,eval()如果我可以避免它,我总是回避使用,因为它是邪恶的(而且,无论是对还是错,我一直认为它在JavaScript中更加邪恶,因为要评估的代码可能会被用户改变).
那么,什么时候可以使用它?
据说Javascript的一个主要优点是它是一种基于原型的语言.
但是,Javascript基于原型是什么意思,为什么这是一个优势呢?
根据Node.js手册:
如果希望模块导出的根是函数(例如构造函数),或者如果要在一个赋值中导出完整对象而不是一次构建一个属性,请将其分配给module.exports而不是export .
给出的例子是:
// file: square.js
module.exports = function(width) {
return {
area: function() {
return width * width;
}
};
}
Run Code Online (Sandbox Code Playgroud)
并像这样使用:
var square = require('./square.js');
var mySquare = square(2);
console.log('The area of my square is ' + mySquare.area());
Run Code Online (Sandbox Code Playgroud)
我的问题:为什么示例不使用square作为对象?以下是否有效,是否使示例更"面向对象"?
var Square = require('./square.js');
var mySquare = new Square(2);
console.log('The area of my square is ' + mySquare.area());
Run Code Online (Sandbox Code Playgroud) 有以下查询结果:(key1和key2可以是任何文本)
id key1 key2 value
1 fred apple 2
2 mary orange 10
3 fred banana 7
4 fred orange 4
5 sarah melon 5
...
Run Code Online (Sandbox Code Playgroud)
我希望将数据存储在网格中(可能作为一个数组)循环所有记录,如下所示:
apple orange banana melon
fred 2 4 7 -
mary - 10 - -
sarah - - - 5
Run Code Online (Sandbox Code Playgroud)
在PHP中,使用关联数组非常简单:
$result['fred']['apple'] = 2;
Run Code Online (Sandbox Code Playgroud)
但在像这样的JavaScript关联数组中不起作用.阅读了大量的教程后,我能得到的就是:
arr=[];
arr[1]['apple'] = 2;
Run Code Online (Sandbox Code Playgroud)
但arr['fred']['apple'] = 2;不起作用.我尝试过对象数组,但对象属性不能是自由文本.我阅读教程越多,我就越困惑......
欢迎任何想法:)
Crockford的书,JavaScript:The Good Parts,(第114页)说构造函数应始终给出带有首字母大写字母(即Point)的名称,并且带有首字母大写字母的函数名称只能与构造函数一起使用(其他一切都应该是lowerCase).
这个约定有助于我们避免忘记使用new构造函数的运算符.
他接着说,"更好的应对策略是根本不使用new."
我的问题是,我们如何编程JavaScript而不使用它new?
new Object()和new Array()文字{}和[].new Number(),new Boolean()以及new String()用0,true和''.new RegExp()类似的事情/pattern/.我们如何避免new Date()?
而且,最重要的是,我们如何避免使用new自己的自定义对象?
两者之间有什么区别(如果有的话)
x = Array()
Run Code Online (Sandbox Code Playgroud)
和
x = new Array()
Run Code Online (Sandbox Code Playgroud)
我应该使用哪一个?
在过去的几年里,我几乎专注于后端任务,我刚刚注意到,在我缺席的情况下,大多数JavaScript(和CoffeeScript)项目都变得更加漂亮.
我主要在rails环境中工作,几乎所有的JavaScript/jQuery都看起来像这样:
$(an_element).an_event(function() {
stuff_i_want_to_do;
})
$(another_element).some_other_event(function() {
some_other_stuff_i_want_to_do;
})
Run Code Online (Sandbox Code Playgroud)
抛开回调,这几乎就是它.
无论如何,只是浏览一些其他人的代码,并注意到许多javascripters在我不在的时候变得更漂亮.这并不复杂,但它是我所见过的更新/更好的JavaScript方法的典型:
jQuery ->
if $('#products').length
new ProductsPager()
class ProductsPager
constructor: (@page = 1) ->
$(window).scroll(@check)
check: =>
if @nearBottom()
@page++
$(window).unbind('scroll', @check)
$.getJSON($('#products').data('json-url'), page: @page, @render)
#
nearBottom: =>
$(window).scrollTop() > $(document).height() - $(window).height() - 50
render: (products) =>
for product in products
$('#products').append Mustache.to_html($('#product_template').html(), product)
$(window).scroll(@check) if products.length > 0
Run Code Online (Sandbox Code Playgroud)
我一直在寻找有关JavaScript(和/或CoffeeScript)的现代最佳实践/模式的资源,但我没有太多运气.所以简而言之,我应该在哪里加快速度:最好的javascript/coffeescript现代模式和实践?
在JSLint中,它警告说
var x = new Array();
Run Code Online (Sandbox Code Playgroud)
(这不是一个真正的变量名称)应该是
var result = [];
Run Code Online (Sandbox Code Playgroud)
第一种语法有什么问题?这个建议背后的原因是什么?
javascript ×10
jslint ×2
new-operator ×2
oop ×2
arrays ×1
coding-style ×1
coffeescript ×1
commonjs ×1
constructor ×1
eval ×1
inheritance ×1
jquery ×1
node.js ×1
syntax ×1
use-strict ×1