Questions tagged «javascript»

JavaScript(不要与Java混淆)是一种高级,动态,多范式,弱类型的语言,用于客户端脚本和服务器端脚本。使用此标记可解决有关ECMAScript,JavaScript,JScript等的常见实现的问题。JS通常不引用其ECMA-表兄弟ActionScript。

6
Coffeescript的优缺点是什么?[关闭]
当然,在很多情况下,语法糖的大量使用会导致代码缩短,这是一大优点。在http://jashkenas.github.com/coffee-script/上,有许多令人印象深刻的示例。另一方面,我怀疑这些示例是否代表了复杂的实际应用程序的代码。例如,在我的代码中,我从不向裸对象添加函数,而是向其原型添加函数。而且,原型功能对用户是隐藏的,这表明是经典的OOP而不是惯用的Javascript。 数组理解示例将在我的代码中看起来像这样: cubes = $.map(list, math.cube); // which is 8 characters less using jQuery...

7
一致的代码样式的实际价值是什么
我是顾问团队的成员,该团队为客户实施新的解决方案。我负责客户端代码库(React和javascript)上的大多数代码审查。 我注意到一些团队成员使用独特的编码模式,以至于我可以从一个样式中随机选择一个文件,以告诉谁是作者。 示例1(一次性内联函数) React.createClass({ render: function () { var someFunc = function () { ... return someValue; }; return <div>{someFunc()}</div> } }); 作者认为,通过为someFunc分配有意义的名称,代码将更易于阅读。我相信,通过内联函数并添加注释,可以达到相同的效果。 示例2(未绑定函数) function renderSomePart(props, state) { return ( <div> <p>{props.myProp}</p> <p>{state.myState}</p> </div> ); } React.createClass({ render: function () { return <div>{renderSomePart(this.props, this.state)}</div>; } }); 这是我们通常的做法(避免通过状态和道具): React.createClass({ renderSomePart: function …

2
生成唯一且安全的标识符以供“有时离线” Web应用程序使用的策略
我有一个基于Web的项目,允许用户联机和脱机工作,我正在寻找一种为客户端记录生成唯一ID的方法。我想要一种方法,该方法在用户脱机时(即无法与服务器对话)有效,并且保证是唯一的并且是安全的。通过“安全”,我特别担心客户端(恶意或以其他方式)提交重复的ID,从而严重破坏数据完整性。 我一直在做一些谷歌搜索,希望这已经解决了。我还没有找到任何非常确定的东西,尤其是在生产系统中使用的方法方面。我发现了一些系统的示例,在这些系统中,用户将仅访问他们创建的数据(例如,在多个设备上访问的Todo列表,但仅由创建它的用户访问)。不幸的是,我需要一些更复杂的东西。我确实在这里找到了一些非常好的想法,这些想法与我一直认为事情可能有效的方式是一致的。 以下是我建议的解决方案。 一些要求 ID应该是全局唯一的(或至少在系统中唯一) 在客户端上生成(即通过浏览器中的javascript) 安全(如上所述和其他方面) 数据可以由多个用户查看/编辑,包括未编写数据的用户 不会对后端数据库(例如MongoDB或CouchDB)造成严重的性能问题 拟议的解决方案 当用户创建帐户时,将为他们提供一个uuid,该uuid由服务器生成,并且在系统内是唯一的。此ID不得与用户身份验证令牌相同。我们将此ID称为用户的“ ID令牌”。 当用户创建新记录时,他们会在javascript中生成新的uuid(如果可用,则使用window.crypto生成。请参见此处的示例)。该ID与用户创建帐户时收到的“ ID令牌”并置。现在,此新的复合ID(服务器端ID令牌+客户端uuid)是记录的唯一标识符。当用户在线并将此新记录提交到后端服务器时,该服务器将: 将其标识为“插入”操作(即不是更新或删除) 验证组合键的两个部分都是有效的uuid 验证所提供的复合ID的“ ID令牌”部分对于当前用户是否正确(即,它与服务器在创建用户时分配给该用户的ID令牌相匹配) 如果一切copasetic,插入数据到数据库(小心做插入,而不是一个“更新插入”,这样如果ID 确实已经存在,它不会更新错误现有记录) 查询,更新和删除不需要任何特殊逻辑。他们将简单地以与传统应用程序相同的方式将id用于记录。 这种方法的优点是什么? 客户端代码可以在脱机时创建新数据,并立即知道该记录的ID。我考虑了替代方法,即在客户端上生成一个临时ID,然后在系统联机时将其替换为“最终” ID。但是,这感觉很脆弱。特别是当您开始考虑使用外键创建子数据时,也需要对其进行更新。更不用说处理ID更改后会更改的网址。 通过将ID组合为客户端生成的值和服务器生成的值,每个用户都可以在沙箱中有效地创建ID。这旨在限制恶意/流氓客户端可能造成的损害。同样,任何id冲突都是基于每个用户的,而不是整个系统的全局冲突。 由于用户ID令牌与他们的帐户相关联,因此ID仅可以由经过身份验证的客户端(即用户成功登录的地方)在用户沙箱中生成。这旨在防止恶意客户端为用户创建错误的ID。当然,如果用户的身份验证令牌被恶意客户端窃取,他们可能会做坏事。但是,一旦身份验证令牌被盗,该帐户便会受到威胁。如果确实发生了这种情况,那么所造成的损害将仅限于被盗用的帐户(而不是整个系统)。 顾虑 这是我对这种方法的一些担忧 这样会为大型应用程序生成足够唯一的ID吗?有没有理由认为这会导致id冲突?javascript可以生成足够随机的uuid使其正常工作吗?看起来window.crypto 相当广泛,该项目已经需要相当现代的浏览器。(此问题现在有一个单独的SO问题) 我是否缺少任何漏洞,这些漏洞可能允许恶意用户破坏系统? 查询由2个uuid组成的组合键时,是否有理由担心数据库性能。应该如何存储此ID以获得最佳性能?两个单独的字段还是一个对象字段?Mongo和Couch会有不同的“最佳”方法吗?我知道在执行插入操作时,使用非顺序主键会导致明显的性能问题。为主键自动生成一个值并将该ID存储为单独的字段会更聪明吗?(此问题现在有一个单独的SO问题) 使用这种策略,可以很容易地确定一组特定记录是由同一用户创建的(因为它们都共享相同的公共可见id令牌)。虽然我看不到有任何立即出现的问题,但最好不要泄露比内部需求更多的信息。另一种可能性是对复合键进行哈希处理,但这似乎比其价值更大。 如果用户发生ID冲突,则没有简单的恢复方法。我想客户端可以生成一个新的id,但这似乎确实是不应该发生的。我打算解决这个问题。 只有经过身份验证的用户才能查看和/或编辑数据。这是我的系统可接受的限制。 结论 以上是合理的计划吗?我意识到其中一些归结为基于对相关应用程序的更全面了解的判断调用。

10
为什么要避免内联脚本编写?
一位知识渊博的朋友最近浏览了我帮助启动的网站,并评论了诸如“非常酷的网站,对源代码中的内联脚本感到羞耻”之类的内容。 我绝对可以删除发生内联脚本的位置;我隐约意识到这是“一件坏事”。我的问题是:内联脚本的真正问题是什么?是否存在重大的性能问题,还是仅是良好风格的问题?当还有其他事情需要处理时,我可以证明对上级的内联脚本方面立即采取行动是合理的吗?如果您打开一个网站并看了一眼源代码,什么因素会导致您说“嗯,在这里从事专业工作”,什么原因会使您从显然业余的工作中退缩? 好的,在写作中那个问题变成了多个问题。但是基本上,内联脚本-有什么关系?

8
为什么在提交(并再次在服务器上再次对其进行哈希处理)之前,客户端中几乎没有网页会在客户端中对密码进行哈希处理,以“防止”密码重用?
Internet上有许多站点需要登录信息,并且防止密码重用的唯一方法是“保证”密码在服务器上被散列,但这并不总是正确的。 因此,我想知道,在将密码发送到服务器之前,在客户端计算机(使用Javascript)中创建一个哈希密码的网页有多困难?从理论上讲,这不会提供任何额外的安全性,但是在实践中,这可以用来防止不会在服务器中哈希密码的“恶意站点”。

4
为什么+对于连接这么不好?
每个人都在说JavaScript的问题之一是使用+[ example ]进行字符串连接。有人说问题不在使用+,而是强制类型[请参阅上一个示例的注释]。但是强类型语言将+用于连接和强制类型没有任何问题。例如,在C#中: int number = 1; MyObject obj = new MyObject(); var result = "Hello" + number + obj; // is equivalent to string result = "hello" + number.ToString() + obj.ToString(); 那么,为什么JavaScript中的字符串连接这么大的问题呢?
44 javascript 

4
为什么C#开发人员用换行符括起来?[关闭]
在过去的几年中,我大部分时间主要用于C#和SQL。在那段时间里,与我合作的每个程序员都习惯将函数或控制流语句的左括号放在新的一行上。所以... public void MyFunction(string myArgument) { //do stuff } if(myBoolean == true) { //do something } else { //do something else } 我一直对这是多么浪费空间感到震惊,尤其是在if / else语句中。而且我知道在C#的更高版本中存在替代方法,例如: if(myBoolean == true) //do something on one line of code 但是几乎没有人使用过它们。每个人都在做换行符。 缺席很久之后,我又重新开始使用JavaScript。在我的记忆中,JavaScript开发人员曾经做过完全相同的curl-brace-newline事情,但是对于所有花哨的新库和新东西,大多数开发人员都在声明后加上了大括号: function MyJavaScriptFunction() { //do something } 您可以从中看到这种感觉,因为自从使用闭包和函数指针在JavaScript中变得很流行以来,它就节省了大量空间并提高了可读性。所以我想知道为什么它在C#中没有被视为完成的事情。实际上,如果您在Visual Studio 2013中尝试上述构造,它实际上会为您重新格式化,将开括号放在新的一行上! 现在,我在Code Review SE上看到了这个问题:https : …
44 java  c#  javascript  syntax 


5
如何避免典型的“动态语言错误”?
我最近在JavaScript中投入了几个小时,因为我想从庞大的用户群中受益。这样做时,我注意到大多数人都将其归因于动态语言。您可以使事情真正快速地工作,但是一旦代码达到一定的大小,通常会浪费大量时间进行类型,拼写和重构错误。错误通常会使我免于编译器的困扰。当我在另一个模块中输入错字时,不必让我寻找逻辑错误。 考虑到以下令人难以置信的JavaScript和其他动态类型语言使我相信我的方法有问题。还是这仅仅是您必须支付的价格? 简而言之: 您如何使用〜2000 LOC处理JavaScript(或其他动态语言)项目? 有没有工具可以防止我犯这些错误?我已经尝试了Facebook和JSHint的流程,这对您有所帮助,但请不要输入错字。


3
DOM有什么不好的地方?
我一直在听到人们(尤其是Crockford)说DOM是一个糟糕的API,但并没有真正证明这一说法的合理性。除了跨浏览器不一致之外,为什么认为DOM如此糟糕还有哪些原因?

7
引用外部JavaScript与托管我自己的副本
假设我有一个使用jQuery的网络应用。更好的做法是将必要的javascript文件与网站文件一起托管在我自己的服务器上,还是在jQuery的CDN上引用它们(例如:http : //code.jquery.com/jquery-1.7.1.min.js) ? 我可以看到双方的优点: 如果是在我的服务器上,那就少了一个外部依赖性。如果jQuery崩溃或更改了其托管结构或类似的东西,那么我的应用程序就会崩溃。但是我觉得这种情况不会经常发生。必须有许多小型站点这样做,并且jQuery团队将希望避免破坏它们。 如果是在我的服务器上,那是一个比别人少的外部参考,有人可以称之为安全问题 如果它是从外部引用的,那么我不必担心为文件提供服务的带宽(尽管我知道不是很多)。 如果从外部引用它,而我正在将该网站部署到许多需要拥有所有文件副本的服务器上,那么我要记住要复制/更新的文件要少一个。

8
如何开始使用HTML5?[关闭]
建议学习HTML5的工作流程是什么?我应该安装什么工具?什么SDK?从哪儿开始?怎么测试?如何调试?我读什么? 我知道通常被标记为“ HTML5开发”的实际上是HTML,CSS,JS和更多内容的混合体,但是我不认为在记事本中开发更大的项目。这就是为什么我要您透露有关工作流程的提示和技巧。
42 javascript  html  css  ajax  html5 

9
具有自定义属性的JS布尔运算是否不好?
在JS中,您可以返回具有自定义属性的布尔值。例如。当Modernizr测试视频支持时,它返回true,false但是返回的布尔值(布尔是JS中的第一类对象)具有指定支持哪种格式的属性。起初它使我感到有些惊讶,但后来我开始喜欢这个主意,并开始怀疑为什么它似乎很少使用? 它看起来像是一种优雅的方式来处理所有这些情况,在这些情况下,您基本上想知道某件事是对还是错,但是您可能对无需定义自定义返回对象或不准备使用回调函数就可以定义的一些其他信息感兴趣。接受更多参数。这样,您可以保留非常通用的功能签名,而不会影响返回更复杂数据的能力。 我可以想象有3种反对的说法: 当最好使任何界面清晰明了而不棘手时,这是不常见/意外的。 这可能是一个稻草人的论点,但由于它有点极端,我可以想象它在某些JS优化器,uglifier,VM中或在稍作清理语言规范更改后悄然适得其反。 有更好的方法-简洁,清晰和通用-完全相同。 所以我的问题是,有什么充分的理由要避免将布尔值与其他属性一起使用?他们是把戏还是款待? 绘制扭曲警告。 以上是最初的问题。正如Matthew Crumley和senevoldsen都指出,这是基于错误的(虚假的?)前提。按照优良的JS传统,Modernizr所做的只是一种语言技巧而又是一种肮脏的手段。归结为具有原始bool的JS,如果将其设置为false,即使在尝试添加道具后(它会默默失败),布尔对象仍将为false;而布尔对象可以具有自定义道具,但成为对象始终是真实的。Modernizr返回布尔布尔值false或真实布尔值对象。 我最初的问题是假设技巧不一样,因此最流行的答案涉及(完全有效的)编码标准方面。但是,我发现揭穿整个窍门的答案最有帮助(以及反对使用该方法的最终论点),因此我接受其中一个。感谢所有参与者!

7
为什么不将样式/脚本嵌入HTML而不是链接?
我们将CSS和JavaScript文件连接起来以减少HTTP请求的数量,从而提高了性能。结果是这样的HTML: <link rel="stylesheet" href="all-my-css-0fn392nf.min.css"> <!-- later... --> <script src="all-my-js-0fn392nf.min.js"></script> 如果我们拥有服务器端/构建逻辑来为我们完成所有这些工作,为什么不更进一步,并将这些串联的样式和脚本嵌入HTML? <style>.all{width:100%;}.my{display:none;}.css{color:white;}</style> <!-- later... --> <script>var all, my, js;</script> 减少了两个HTTP请求,但实际上我还没有看到这种技术。为什么不?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.