Can someone explain if filter(x => !!x)
is equivalent to filter(x => !!x && x)
? While both expressions seem to yield the same result, I am curious about the underlying principles behind this.
Can someone explain if filter(x => !!x)
is equivalent to filter(x => !!x && x)
? While both expressions seem to yield the same result, I am curious about the underlying principles behind this.
It seems that in the filter
method, the return value is considered as Boolean.
!!x
is equivalent to Boolean(!!x)
which is also equivalent to Boolean(x)
.
!!x && x
is also equivalent to Boolean(!!x && x)
, which can further be simplified to Boolean(x) && Boolean(x)
and finally to just Boolean(x)
.
So essentially, they are all equal, that's my understanding.
However, there is a difference in the results of the assignment expression in the code snippet below:
const a = !!x && x
const b = !!x
In an &&
operator like exp1 && exp2
, if exp1 evaluates to false, then exp2 will not execute. But when exp1 is true, exp2 will still execute.
Therefore, in assignment expressions:
!!x
will always return either true
or false
, essentially returning a Boolean
.!!x
is false:
!!x
will always be equal to !!x && x
!!x
is true:
!!x
is equal to !!x && x
only when x
is a Boolean
Let's conduct some experiments to observe the different outputs for each value in order to understand how they behave.
const values = [-1, 0, 1, 2, {a:'foo'}, null, undefined, true, false, 'true', 'false', 'foo'];
let htmlStr = '';
values.forEach(x => {
htmlStr += `
<tr>
<td>${JSON.stringify(x, null, 0)}</td>
<td><code>${JSON.stringify(!!x, null, 0)}</code></td>
<td><code>${JSON.stringify((!!x && x), null, 0)}</code></td>
</tr>`;
});
document.querySelector('tbody').innerHTML = htmlStr;
table, th, td {border:1px solid #DDD; border-collapse:collapse;}
td, th {padding: .25rem;}
code{color: #b71313;}
<table>
<thead>
<tr>
<th>Value</th>
<th><code>!!x</code></th>
<th><code>!!x && x</code></th>
</tr>
</thead>
<tbody></tbody>
</table>
The main purpose of a filter
function is to evaluate what should or should not be included in the results by returning a boolean
. The observations made here reveal that the !!x
method consistently produces a boolean output, making it suitable for basic evaluations.
Nevertheless, it is essential to note that a boolean conversion does not always align with the intended logic in your application! For instance, consider whether converting the string "false"
to true
serves your intended purpose.
In conclusion, !!x
offers a reliable way to convert values into booleans, but it is crucial to ensure that the converted result aligns with the desired functionality for your specific use case. It is not a universal solution due to the potential for misinterpretation in various scenarios.
When considering !!x, it is not the same as !!x && x
However, why do they yield similar results when utilized in filter functions?
In order to grasp how variables are assessed within a conditional statement, it is advised to consult:
For numerous scenarios where filtering for truthy values is necessary, the filter method can be succinctly written as follows:
filter(x => x)
Conversely, a falsy filter can be expressed as:
filter(x => !x)
Now, assuming we have a sample variable
const x = "A"
const notX = !x // false (!"A")
const notNotX = !!x // true (!!"A")/(!notX)
const whatIsThis = (notNotX && x) // "A" || interpreted as (true && "A")
// In any other context, it evaluates as the original value of x, here: "A"
console.log(whatIsThis)
// In boolean context, it is considered truthy
if(whatIsThis) console.log(true)
console.log(whatIsThis === notNotX) // false, whatIsThis does not equal notNotX
Whenever x
itself is viewed as truthy,
!!x
will output true
Another approach to understanding why the filter returns identical results is by interpreting the statements as
!!x
is true
!!x && x
translates to true && "truthy"
Can you help me figure out how to dynamically create IDs like this? <div id="track_1"></div> <div id="track_2"></div> I tried assigning the IDs from the parent component like this: export default function Compon ...
I recently encountered an issue while using jQuery.load to load a new page. The content on the original page is being treated strangely in some way. Specifically, I have code on the original page that formats LaTeX commands with MathJax: <script type=" ...
Why is Heroku indicating that compression is undefined? Strangely, when I manually set process.env.NODE_ENV = 'production' and run the app with node server, everything works perfectly... Error log can be found here: https://gist.github.com/anony ...
After researching how to render an MVC View into Angular 2, I came across this helpful directive export function createComponentFactory(compiler: Compiler, metadata: Component): Promise<ComponentFactory<any>> { const cmpClass = class Dynamic ...
I have an array of objects containing car data: [ { year: 2019, company: 'Toyota', quantity: '450' }, { year: 2019, company: 'Ford', quantity: '600' }, { year: 2020, company: ...
I want to add this JSON data to an HTML element. [ { "website":"google", "link":"http://google.com" }, { "website":"facebook", "link":"http://fb.com" } ] Is there an easy way to convert this using a plugin ...
Sorry for the possibly silly question, but as I delve into Javascript and Django, I'm struggling with a specific issue. Despite spending hours on it, I can't seem to figure out why my image isn't displaying in my Django HTML template. Here ...
I am still learning javascript and I want to make a banner appear if the textbox is empty, but it's not working. How can I use bootstrap banners to create an alert? <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&g ...
Exploring this example https:// codepen.io/ducktectiveQuack/pen/mPGMRZ I had trouble understanding the code block, so I resorted to trickery (just remove the space between the '/' and the 'c' lol) My goal is to have the hamburger men ...
New Experience with Next.js and Tailwind CSS Exploring the next/font Package Delving into the realm of the new next/font package has been quite interesting. Following the tutorial provided by Next.js made the setup process smooth sailing. I've incorp ...
The reference documentation notes the following: updateOn: a string that specifies which event should be bound to the input. Multiple events can be set using a space delimited list. There is also a special 'default' event that aligns with the ...
I have a situation where I have an object that contains latitude and longitude attributes. My goal is to find the closest match in an array of similar objects by considering both latitude and longitude. obj = {latitude: 55.87, longitude: 4.20} [ { & ...
Having just started with nodejs, I created a nodejs program and set it to run every minute using the node-schedule library. However, after running for some time and producing several logs in the console, I encountered an error stating that this.job.execute ...
Recently, I created a small directive that wraps its contents with another template file. The objective is to transform the code like this: <layout name="Default">My cool content</layout> into this output: <div class="layoutDefault">My ...
Here is the HTML code provided: <label for="xxxx" id="Password_label"> <div class="xxxx">Password 555</div> 555 <div class="xxx"></div> </label> I am attempting to replace the text "555" that appears inside th ...
Upon reaching the bottom of the page and scrolling back up, an error is thrown by React stating "TypeError: _this.setState is not a function" The scroll handler in question monitors the position of the client on the page. If the client is within the home ...
Here's the issue I'm facing: export const RegisterUser = async (request: Request): Promise<[number, UserResponse | { message: any }]> => { let userRequest = plainToClass(UserRequest, request.body); let errors = await validate(u ...
After exploring similar posts without success, I am reaching out here for help. I have a Json data stored in a hidden field that I am trying to access in the code behind file of my markup page. My goal is to convert this Json into a List and bind it to a ...
I'm currently developing an app using Nodejs and express, where orders can be placed for specific products. In this application, when an order is received, it is saved in the database and a PDF receipt is generated immediately. However, since generati ...
I am struggling to set up a jquery slider (flexslider) It seems like I am overlooking something very fundamental, but for some reason I just can't figure it out. Any assistance would be greatly appreciated. Please check out the link to the test site ...